diff --git a/about.html b/about.html index a544e58f31..4555d593c4 100644 --- a/about.html +++ b/about.html @@ -38,7 +38,7 @@ Committer [2018 Aug - 2018 Dec]
Contributor [2018 May - 2018 Aug]

Peh Xian Bin, Eugene


Role: Maintainer [2020 May - 2021 Jan]
Project Lead [2018 May - 2020 May]

Aditya Agarwal

Contributor [2018 May - 2018 Aug]

Apoorva Ullas

Contributor [2018 Aug - 2019 May]

Chelsey Ong Hee

Contributor [2018 Dec - 2019 May]

Gilbert Emerson

Contributor [2018 Dec - 2019 May]

Teo Ming Yi

Contributor [2018 Dec - 2019 May]

Jin Minjia

Role: Contributor [2019 May - 2019 Aug]

James Pang Mun Wai


Role: Committer [2020 May - 2021 Jan]
-Contributor [2019 May - 2020 May]

Lee Jin Yao


Role: Contributor [2019 May - 2020 May]

Chong Chee Yuan

Role: Contributor [2020 January - 2020 May]

Ni Tianzhen

Role: Contributor [2020 January - 2020 May]

Yash Chowdhary


Role: Contributor [2020 January - 2020 May]

Liu Yiwen

Role: Contributor [2019 August - 2021 May]

Tejas Bhuwania


Role: Contributor [2019 August - 2021 August]

Anubhav

Role: Contributor [2019 September - 2020 August]

Ang Ze Yu

Role: Contributor [2020 January - 2021 May]

Roland Yu Wenyang

Role: Contributor [2021 January - 2021 March]

+Contributor [2019 May - 2020 May]

Lee Jin Yao


Role: Contributor [2019 May - 2020 May]

Chong Chee Yuan

Role: Contributor [2020 January - 2020 May]

Ni Tianzhen

Role: Contributor [2020 January - 2020 May]

Yash Chowdhary


Role: Contributor [2020 January - 2020 May]

Liu Yiwen

Role: Contributor [2019 August - 2021 May]

Tejas Bhuwania


Role: Contributor [2019 August - 2021 August]

Anubhav

Role: Contributor [2019 September - 2020 August]

Ang Ze Yu

Role: Contributor [2020 January - 2021 May]

Roland Yu Wenyang

Role: Contributor [2021 January - 2021 March]

diff --git a/about.page-vue-render.js b/about.page-vue-render.js index c2662c3ecc..2a106be042 100644 --- a/about.page-vue-render.js +++ b/about.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('navbar',{attrs:{"type":"dar with(this){return _c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-3",attrs:{"id":"about-us"}},[_c('span',[_v("About us")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#about-us","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("RepoSense is a project based in the "),_c('a',{attrs:{"href":"http://www.comp.nus.edu.sg/"}},[_v("National University of Singapore, School of Computing")]),_v(", funded by a "),_c('em',[_v("Teaching Enhancement Grant")]),_v(" from the "),_c('a',{attrs:{"href":"https://nus.edu.sg/cdtl"}},[_v("NUS Center for Development of Teaching and Learning")]),_v(".")]),_v(" "),_c('h2',{attrs:{"id":"current-team"}},[_v("Current team"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#current-team","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"damith-c-rajapakse"}},[_c('a',{attrs:{"href":"http://www.comp.nus.edu.sg/~damithch"}},[_v("Damith C. Rajapakse")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#damith-c-rajapakse","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars.githubusercontent.com/u/1673303?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars.githubusercontent.com/u/1673303?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Project Advisor")]),_v(" "),_c('h3',{attrs:{"id":"charisma-kausar"}},[_c('a',{attrs:{"href":"https://www.github.com/ckcherry23"}},[_v("Charisma Kausar")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#charisma-kausar","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Senior Developer [2024 January - ]"),_c('br'),_v("\nContributor [2022 December - 2024 January]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"david-gareth-ong"}},[_c('a',{attrs:{"href":"https://www.github.com/vvidday"}},[_v("David Gareth Ong")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#david-gareth-ong","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Senior Developer [2024 January - ]"),_c('br'),_v("\nContributor [2023 January - 2024 January]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"gokul-rajiv"}},[_c('a',{attrs:{"href":"https://github.com/gok99"}},[_v("Gokul Rajiv")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#gokul-rajiv","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Senior Developer [2024 January - ]"),_c('br'),_v("\nContributor [2022 January - 2024 January]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"marcus-tang-xin-kye"}},[_c('a',{attrs:{"href":"https://www.github.com/MarcusTXK"}},[_v("Marcus Tang Xin Kye")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#marcus-tang-xin-kye","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Senior Developer [2024 January - ]"),_c('br'),_v("\nContributor [2023 January - 2024 January]"),_c('br')]),_v(" "),_c('h2',{attrs:{"id":"chang-si-kai"}},[_c('a',{attrs:{"href":"https://github.com/sikai00"}},[_v("Chang Si Kai")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chang-si-kai","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2023 Jan - ]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"alvis-ng"}},[_c('a',{attrs:{"href":"https://www.github.com/supermii2"}},[_v("Alvis Ng")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#alvis-ng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2024 January - ]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"george-tay-quan-yao"}},[_c('a',{attrs:{"href":"https://www.github.com/jonasongg"}},[_v("George Tay Quan Yao")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#george-tay-quan-yao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2024 January - ]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"jonas-ong-si-wei"}},[_c('a',{attrs:{"href":"https://www.github.com/jonasongg"}},[_v("Jonas Ong Si Wei")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#jonas-ong-si-wei","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2024 January - ]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"poon-yip-hang-ryan"}},[_c('a',{attrs:{"href":"https://www.github.com/sopa301"}},[_v("Poon Yip Hang, Ryan")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#poon-yip-hang-ryan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2024 January - ]"),_c('br')]),_v(" "),_c('h2',{attrs:{"id":"past-members"}},[_v("Past Members"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#past-members","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"wang-chao"}},[_c('a',{attrs:{"href":"https://github.com/fzdy1914"}},[_v("Wang Chao")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#wang-chao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars3.githubusercontent.com/u/35621726?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars3.githubusercontent.com/u/35621726?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Project Lead [2021 Jan - 2021 Dec]"),_c('br'),_v("\nMaintainer [2020 May - 2021 Jan]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"hsu-zhong-jun"}},[_c('a',{attrs:{"href":"https://github.com/dcshzj"}},[_v("Hsu Zhong Jun")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#hsu-zhong-jun","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars.githubusercontent.com/u/27919917?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars.githubusercontent.com/u/27919917?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Project Lead [2022 Jan - 2022 Dec]"),_c('br'),_v("\nCommitter [2021 June - 2021 Dec]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"chan-ger-hean"}},[_c('a',{attrs:{"href":"https://github.com/gerhean"}},[_v("Chan Ger Hean")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chan-ger-hean","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Committer [2022 Jan - 2022 Dec]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"huang-chengyu"}},[_c('a',{attrs:{"href":"https://github.com/HCY123902"}},[_v("Huang Chengyu")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#huang-chengyu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Project Co-Lead [2023 Jan - 2023 Apr]"),_c('br'),_v("\nSenior Dev [2023 Jan - 2023 Apr]"),_c('br'),_v("\nCommitter [2022 Jan - 2022 Dec]"),_c('br'),_v("\nContributor [2021 July - 2021 Dec]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"chan-jun-da"}},[_c('a',{attrs:{"href":"https://github.com/chan-j-d"}},[_v("Chan Jun Da")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chan-jun-da","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Project Co-Lead [2023 Apr- 2023 Dec]"),_c('br'),_v("\nSenior Dev [2023 Jan - 2023 Apr]"),_c('br'),_v("\nCommitter [2022 Jan - 2022 Dec]"),_c('br'),_v("\nContributor [2021 July - 2021 Dec]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"tay-yi-hsuen"}},[_c('a',{attrs:{"href":"https://github.com/yhtMinceraft1010X"}},[_v("Tay Yi Hsuen")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tay-yi-hsuen","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Senior Dev [2023 Jan - 2023 Apr]"),_c('br'),_v("\nCommitter [2022 Jan - 2022 Dec]"),_c('br'),_v("\nContributor [2021 July - 2021 Dec]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"zhou-jiahao"}},[_c('a',{attrs:{"href":"https://github.com/zhoukerrr"}},[_v("Zhou Jiahao")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#zhou-jiahao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Senior Dev [2023 Jan - 2023 Apr]"),_c('br'),_v("\nCommitter [2022 Jan - 2022 Dec]"),_c('br'),_v("\nContributor [2021 July - 2021 Dec]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"ma-tanghao"}},[_c('a',{attrs:{"href":"https://github.com/harryggg"}},[_v("Ma Tanghao")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ma-tanghao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Main developer for the initial version [2017 May - 2018 May]")]),_v(" "),_c('h3',{attrs:{"id":"ong-shu-peng"}},[_c('a',{attrs:{"href":"https://github.com/ongspxm"}},[_v("Ong Shu Peng")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ong-shu-peng","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars0.githubusercontent.com/u/1430854?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars0.githubusercontent.com/u/1430854?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Area Lead for UI [2018 Dec - 2019 May]"),_c('br'),_v("\nCommitter [2018 Aug - 2018 Dec]"),_c('br'),_v("\nContributor [2018 May - 2018 Aug]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"tan-jun-an"}},[_c('a',{attrs:{"href":"https://github.com/yamidark"}},[_v("Tan Jun An")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tan-jun-an","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars3.githubusercontent.com/u/18352498?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars3.githubusercontent.com/u/18352498?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Area Lead for Code Quality [2018 Aug - 2019 April]"),_c('br'),_v("\nCommitter [2018 May - 2018 Aug]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"teng-yong-hao"}},[_c('a',{attrs:{"href":"https://github.com/yong24s"}},[_v("Teng Yong Hao")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teng-yong-hao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars2.githubusercontent.com/u/2003406?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars2.githubusercontent.com/u/2003406?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(":\nMentor [2018 Dec - 2020 May]"),_c('br'),_v("\nCommitter [2018 Aug - 2018 Dec]"),_c('br'),_v("\nContributor [2018 May - 2018 Aug]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"peh-xian-bin-eugene"}},[_c('a',{attrs:{"href":"https://github.com/eugenepeh"}},[_v("Peh Xian Bin, Eugene")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#peh-xian-bin-eugene","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars.githubusercontent.com/u/19277206?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars.githubusercontent.com/u/19277206?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Maintainer [2020 May - 2021 Jan]"),_c('br'),_v("\nProject Lead [2018 May - 2020 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"aditya-agarwal"}},[_c('a',{attrs:{"href":"https://github.com/adityaa1998"}},[_v("Aditya Agarwal")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#aditya-agarwal","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Contributor [2018 May - 2018 Aug]")]),_v(" "),_c('h3',{attrs:{"id":"apoorva-ullas"}},[_c('a',{attrs:{"href":"https://github.com/apoorva17"}},[_v("Apoorva Ullas")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#apoorva-ullas","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Contributor [2018 Aug - 2019 May]")]),_v(" "),_c('h3',{attrs:{"id":"chelsey-ong-hee"}},[_c('a',{attrs:{"href":"https://github.com/chel-seyy"}},[_v("Chelsey Ong Hee")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chelsey-ong-hee","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Contributor [2018 Dec - 2019 May]")]),_v(" "),_c('h3',{attrs:{"id":"gilbert-emerson"}},[_c('a',{attrs:{"href":"https://github.com/emer7"}},[_v("Gilbert Emerson")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#gilbert-emerson","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Contributor [2018 Dec - 2019 May]")]),_v(" "),_c('h3',{attrs:{"id":"teo-ming-yi"}},[_c('a',{attrs:{"href":"https://github.com/myteo"}},[_v("Teo Ming Yi")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#teo-ming-yi","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Contributor [2018 Dec - 2019 May]")]),_v(" "),_c('h3',{attrs:{"id":"jin-minjia"}},[_c('a',{attrs:{"href":"https://github.com/bluein-green"}},[_v("Jin Minjia")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#jin-minjia","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2019 May - 2019 Aug]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"james-pang-mun-wai"}},[_c('a',{attrs:{"href":"https://github.com/jamessspanggg"}},[_v("James Pang Mun Wai")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#james-pang-mun-wai","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars1.githubusercontent.com/u/32864116?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars1.githubusercontent.com/u/32864116?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Committer [2020 May - 2021 Jan]"),_c('br'),_v("\nContributor [2019 May - 2020 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"lee-jin-yao"}},[_c('a',{attrs:{"href":"https://github.com/jinyao-lee"}},[_v("Lee Jin Yao")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#lee-jin-yao","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars3.githubusercontent.com/u/35756209?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars3.githubusercontent.com/u/35756209?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Contributor [2019 May - 2020 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"chong-chee-yuan"}},[_c('a',{attrs:{"href":"https://github.com/ccyccyccy"}},[_v("Chong Chee Yuan")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#chong-chee-yuan","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2020 January - 2020 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"ni-tianzhen"}},[_c('a',{attrs:{"href":"https://github.com/niqiukun"}},[_v("Ni Tianzhen")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ni-tianzhen","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2020 January - 2020 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"yash-chowdhary"}},[_c('a',{attrs:{"href":"https://github.com/yash-chowdhary"}},[_v("Yash Chowdhary")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#yash-chowdhary","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars2.githubusercontent.com/u/21968718?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars2.githubusercontent.com/u/21968718?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Contributor [2020 January - 2020 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"liu-yiwen"}},[_c('a',{attrs:{"href":"https://github.com/0blivious"}},[_v("Liu Yiwen")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#liu-yiwen","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2019 August - 2021 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"tejas-bhuwania"}},[_c('a',{attrs:{"href":"https://github.com/Tejas2805"}},[_v("Tejas Bhuwania")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#tejas-bhuwania","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://avatars2.githubusercontent.com/u/35946746?s=150&v=4","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"https://avatars2.githubusercontent.com/u/35946746?s=150&v=4","alt":""}})]),_c('br'),_v(" "),_c('strong',[_v("Role")]),_v(": Contributor [2019 August - 2021 August]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"anubhav"}},[_c('a',{attrs:{"href":"https://github.com/anubh-v"}},[_v("Anubhav")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#anubhav","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2019 September - 2020 August]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"ang-ze-yu"}},[_c('a',{attrs:{"href":"https://github.com/ang-zeyu"}},[_v("Ang Ze Yu")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#ang-ze-yu","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2020 January - 2021 May]"),_c('br')]),_v(" "),_c('h3',{attrs:{"id":"roland-yu-wenyang"}},[_c('a',{attrs:{"href":"https://github.com/rolandyuwy"}},[_v("Roland Yu Wenyang")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#roland-yu-wenyang","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Role")]),_v(": Contributor [2021 January - 2021 March]"),_c('br')])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/contact.html b/contact.html index a441dd386c..f854600236 100644 --- a/contact.html +++ b/contact.html @@ -14,7 +14,7 @@

Contact us

You can post your questions, suggestions, and bug reports in our issue tracker.

Alternatively, you can email us at seer@comp.nus.edu.sg

+

Contact us

You can post your questions, suggestions, and bug reports in our issue tracker.

Alternatively, you can email us at seer@comp.nus.edu.sg

diff --git a/contact.page-vue-render.js b/contact.page-vue-render.js index 27bcaa543c..ae398d2aa0 100644 --- a/contact.page-vue-render.js +++ b/contact.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('navbar',{attrs:{"type":"dar with(this){return _c('div',{attrs:{"id":"flex-body"}},[_c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-3",attrs:{"id":"contact-us"}},[_c('span',[_v("Contact us")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#contact-us","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('span',{staticClass:"fas fa-comment-alt",attrs:{"aria-hidden":"true"}}),_v(" You can post your questions, suggestions, and bug reports in our "),_c('a',{attrs:{"href":"https://github.com/RepoSense/reposense/issues"}},[_v("issue tracker")]),_v(".")]),_v(" "),_c('p',[_c('span',{staticClass:"fas fa-envelope",attrs:{"aria-hidden":"true"}}),_v(" Alternatively, you can email us at "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("seer@comp.nus.edu.sg")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/architecture.html b/dg/architecture.html index 47ea5e4565..c6f946baaf 100644 --- a/dg/architecture.html +++ b/dg/architecture.html @@ -20,7 +20,7 @@
  • analyzes the repositories using the CommitReporter and AuthorshipReporter in a multi-threaded fashion.
  • generates the JSON files needed to generate the HTML report.
  • System

    System contains the classes that interact with the Operating System and external processes.

    Model

    Model holds the data structures that are commonly used by the different aspects of RepoSense.

    + diff --git a/dg/architecture.page-vue-render.js b/dg/architecture.page-vue-render.js index 00badf5a50..2e4d43b6e9 100644 --- a/dg/architecture.page-vue-render.js +++ b/dg/architecture.page-vue-render.js @@ -74,6 +74,6 @@ with(this){return _c('p',[_c('a',{attrs:{"href":"https://github.com/reposense/Re with(this){return _c('ul',[_c('li',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/model/Author.java"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Author")])]),_v(" stores the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Git ID")]),_v(" of an author. Any contributions or commits made by the author, using his/her "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Git ID")]),_v(" or aliases, will be attributed to the same "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Author")]),_v(" object. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AuthorshipReporter")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("CommitsReporter")]),_v(" use it to attribute the commit and file contributions to the respective authors.")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/model/CliArguments.java"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("CliArguments")])]),_v(" stores the parsed command-line arguments supplied by the user. It contains the configuration settings such as the CSV config file to read from, the directory to output the report to, and the date range of commits to analyze. These configuration settings are passed into "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("RepoConfiguration")]),_v(".")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/model/FileTypeManager.java"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("FileTypeManager")])]),_v(" stores the file format to be analyzed and the custom groups specified by the user for any repository.")]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/src/main/java/reposense/model/RepoConfiguration.java"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("RepoConfiguration")])]),_v(" stores the configuration information from the CSV config file for a single repository: the repository's organization, name, branch, list of authors to analyze, date range to analyze commits, and files from "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("CliArguments")]),_v(".\nThis configuration information is used by:\n"),_c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("GitClone")]),_v(" to determine the location to clone the repository from and which branch to check out to.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("AuthorshipReporter")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("CommitsReporter")]),_v(" to determine the range of commits and files to analyze.")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ReportGenerator")]),_v(" to determine the directory to output the report.")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/cli.html b/dg/cli.html index aea863527e..f24e48576f 100644 --- a/dg/cli.html +++ b/dg/cli.html @@ -19,7 +19,7 @@

    --fresh-cloning

    --fresh-cloning: Clones the repo again if it has been cloned before.

    • Used in ConfigSystemTest.
    • Some test cases performs shallow cloning while some does not. Fresh cloning ensures that the test cases that does not perform shallow cloning will clone the repo again if the previous test case uses shallow cloning, ensuring -correctness of the analysis.
    • Requires --test-mode flag to be enabled.
    +correctness of the analysis.
  • Requires --test-mode flag to be enabled.
  • diff --git a/dg/cli.page-vue-render.js b/dg/cli.page-vue-render.js index fad69a63de..64142f4827 100644 --- a/dg/cli.page-vue-render.js +++ b/dg/cli.page-vue-render.js @@ -20,6 +20,6 @@ with(this){return _c('h3',{attrs:{"id":"fresh-cloning"}},[_c('code',{pre:true,at with(this){return _c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--fresh-cloning")])]),_v(": Clones the repo again if it has been cloned before.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/devOpsGuide.html b/dg/devOpsGuide.html index f8a5f2ec6e..770bc2fb93 100644 --- a/dg/devOpsGuide.html +++ b/dg/devOpsGuide.html @@ -14,7 +14,7 @@

    DevOps Guide

    This page documents the various components that form part of the DevOps infrastructure that RepoSense uses.

    GitHub Actions

    GitHub Actions is a platform that is used by RepoSense for running the test suite and is primarily used for continuous integration and testing. The test suite is stored in .github/workflows/ and comprises of:

    • Unit tests (in src/tests/)
    • System tests (in src/systemtest/)
    • Frontend tests (in frontend/cypress/tests/)

    Continuous integration

    All three types of tests in the test suite are run in a single GitHub Actions workflow called "Continuous Integration". The steps are defined in integration.yml and are split into two types of jobs:

    1. Ubuntu/macOS/Windows JDK 11 (mainbuild): Runs both unit tests and system tests on JDK 11 running on supported Ubuntu, macOS and Windows versions. For Ubuntu, this job also produces a RepoSense report and the MarkBind documentation website for previewing.
    2. Cypress frontend tests (cypress): Runs only the frontend tests on JDK 11 running on Ubuntu.

    The list of supported OS versions are available on the GitHub Docs website. These jobs should be updated regularly whenever RepoSense supports newer versions of the Java Development Kit (JDK) as well as when new OS versions are made available (via the job OS matrix). Frontend tests are run separately to take advantage of parallel job execution.

    Some of the jobs execute some commands that are too complicated to be included in the workflow configuration files. Such commands are written in the form of a bash script and are located in the config/gh-actions folder.

    This workflow is run for both incoming pull requests to any branch as well as direct commits to any branch in the repository.

    Cypress frontend tests are run against reports generated from config files in frontend/cypress/config. It uses the cypress branch of the RepoSense repository which is kept independent of master and should be updated only when there are new frontend tests that need to be accommodated.

    Report and documentation previews

    For each pull request to any branch in the repository, a RepoSense report and the MarkBind documentation website is generated based on the code submitted in the pull request. This is to facilitate pull request reviewers in being able to quickly preview how the RepoSense report and/or the documentation website will change after the pull request is merged.

    Due to security considerations in preventing pwn requests, the deployment of the report and documentation previews were split across two workflows in pull request #1411:

    1. Surge.sh pending build (defined in pending.yml): Used for gathering information about the pull request and update the pull request checklist to indicate that the previews are pending.
    2. Surge.sh build preview (defined in surge.yml): Used for actually deploying the RepoSense report and documentation website to Surge.sh and updating the pull request checklist to link to the preview websites.

    The previews are recognised as GitHub deployments and are named dashboard-$PRNUMBER and docs-$PRNUMBER, where $PRNUMBER is the pull request number. Once a preview is ready, the reviewer would be able to click on "View deployment" or "Show environments" in the pull request to open the preview websites.

    Both the "Surge.sh pending build" and "Continuous Integration" workflows produce an artifact respectively, which is then downloaded by the "Surge.sh build preview" workflow to be deployed to Surge.sh. Due to limitations in GitHub Actions in determining the workflow execution order, the "Surge.sh pending build" workflow is assumed to have been completed before the "Continuous Integration" workflow is completed.

    This task is not performed on commits to the repository, as there is no need to do so.

    After the pull request is closed or merged, the Surge.sh deployments are retained, while the GitHub environments for them are cleared by another workflow "Clear deployments for closed pull requests" (defined in delete-deploy.yml). The workflow uses delete-deploy.sh (found in the config/gh-actions/ folder) to remove the environments on GitHub, and to leave a comment on the pull request with links to the Surge.sh previews for later reference.

    GitHub Pages

    This task builds the MarkBind documentation website on every push to the master branch. The steps are defined in gh-pages.yml.

    Stale pull requests

    This task automates the cleaning up of the pull requests by automatically marking inactive pull requests as stale and subsequently closing them. The steps and configurations are defined in stale.yml and the job is triggered automatically once per day.

    Codecov

    Codecov is a platform for checking the code coverage status of the project and the pull request patch. It runs automatically on each pull request and the settings are located in codecov.yml.

    Surge.sh

    Surge.sh is a platform for hosting the RepoSense report and documentation preview builds. The deployment is automatically performed by the "Surge.sh build preview" job using the deploy.sh script in the config/gh-actions/ folder.

    For authentication, two secrets are stored and used in GitHub Actions:

    1. SURGE_LOGIN - Holds the email address to use for the Surge.sh account
    2. SURGE_TOKEN - Holds the secret account token generated for the above account (generated using surge token)

    The surge command automatically detects the existence of these two environment variables and use them for authentication when deploying the RepoSense report and documentation build previews.

    Currently, deployments are kept forever, even after the pull request is merged or closed. There is currently no existing functionality to automatically clean up deployments after they are no longer useful.

    +

    DevOps Guide

    This page documents the various components that form part of the DevOps infrastructure that RepoSense uses.

    GitHub Actions

    GitHub Actions is a platform that is used by RepoSense for running the test suite and is primarily used for continuous integration and testing. The test suite is stored in .github/workflows/ and comprises of:

    Continuous integration

    All three types of tests in the test suite are run in a single GitHub Actions workflow called "Continuous Integration". The steps are defined in integration.yml and are split into two types of jobs:

    1. Ubuntu/macOS/Windows JDK 11 (mainbuild): Runs both unit tests and system tests on JDK 11 running on supported Ubuntu, macOS and Windows versions. For Ubuntu, this job also produces a RepoSense report and the MarkBind documentation website for previewing.
    2. Cypress frontend tests (cypress): Runs only the frontend tests on JDK 11 running on Ubuntu.

    The list of supported OS versions are available on the GitHub Docs website. These jobs should be updated regularly whenever RepoSense supports newer versions of the Java Development Kit (JDK) as well as when new OS versions are made available (via the job OS matrix). Frontend tests are run separately to take advantage of parallel job execution.

    Some of the jobs execute some commands that are too complicated to be included in the workflow configuration files. Such commands are written in the form of a bash script and are located in the config/gh-actions folder.

    This workflow is run for both incoming pull requests to any branch as well as direct commits to any branch in the repository.

    Cypress frontend tests are run against reports generated from config files in frontend/cypress/config. It uses the cypress branch of the RepoSense repository which is kept independent of master and should be updated only when there are new frontend tests that need to be accommodated.

    Report and documentation previews

    For each pull request to any branch in the repository, a RepoSense report and the MarkBind documentation website is generated based on the code submitted in the pull request. This is to facilitate pull request reviewers in being able to quickly preview how the RepoSense report and/or the documentation website will change after the pull request is merged.

    Due to security considerations in preventing pwn requests, the deployment of the report and documentation previews were split across two workflows in pull request #1411:

    1. Surge.sh pending build (defined in pending.yml): Used for gathering information about the pull request and update the pull request checklist to indicate that the previews are pending.
    2. Surge.sh build preview (defined in surge.yml): Used for actually deploying the RepoSense report and documentation website to Surge.sh and updating the pull request checklist to link to the preview websites.

    The previews are recognised as GitHub deployments and are named dashboard-$PRNUMBER and docs-$PRNUMBER, where $PRNUMBER is the pull request number. Once a preview is ready, the reviewer would be able to click on "View deployment" or "Show environments" in the pull request to open the preview websites.

    Both the "Surge.sh pending build" and "Continuous Integration" workflows produce an artifact respectively, which is then downloaded by the "Surge.sh build preview" workflow to be deployed to Surge.sh. Due to limitations in GitHub Actions in determining the workflow execution order, the "Surge.sh pending build" workflow is assumed to have been completed before the "Continuous Integration" workflow is completed.

    This task is not performed on commits to the repository, as there is no need to do so.

    After the pull request is closed or merged, the Surge.sh deployments are retained, while the GitHub environments for them are cleared by another workflow "Clear deployments for closed pull requests" (defined in delete-deploy.yml). The workflow uses delete-deploy.sh (found in the config/gh-actions/ folder) to remove the environments on GitHub, and to leave a comment on the pull request with links to the Surge.sh previews for later reference.

    GitHub Pages

    This task builds the MarkBind documentation website on every push to the master branch. The steps are defined in gh-pages.yml.

    Stale pull requests

    This task automates the cleaning up of the pull requests by automatically marking inactive pull requests as stale and subsequently closing them. The steps and configurations are defined in stale.yml and the job is triggered automatically once per day.

    Codecov

    Codecov is a platform for checking the code coverage status of the project and the pull request patch. It runs automatically on each pull request and the settings are located in codecov.yml.

    Surge.sh

    Surge.sh is a platform for hosting the RepoSense report and documentation preview builds. The deployment is automatically performed by the "Surge.sh build preview" job using the deploy.sh script in the config/gh-actions/ folder.

    For authentication, two secrets are stored and used in GitHub Actions:

    1. SURGE_LOGIN - Holds the email address to use for the Surge.sh account
    2. SURGE_TOKEN - Holds the secret account token generated for the above account (generated using surge token)

    The surge command automatically detects the existence of these two environment variables and use them for authentication when deploying the RepoSense report and documentation build previews.

    Currently, deployments are kept forever, even after the pull request is merged or closed. There is currently no existing functionality to automatically clean up deployments after they are no longer useful.

    diff --git a/dg/devOpsGuide.page-vue-render.js b/dg/devOpsGuide.page-vue-render.js index 3f45bcce54..75fccd5ddd 100644 --- a/dg/devOpsGuide.page-vue-render.js +++ b/dg/devOpsGuide.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"fixed":""} with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-4",attrs:{"id":"devops-guide"}},[_c('span',[_v("DevOps Guide")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#devops-guide","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"lead"},[_c('p',[_v("This page documents the various components that form part of the DevOps infrastructure that RepoSense uses.")])]),_v(" "),_c('h2',{attrs:{"id":"github-actions"}},[_v("GitHub Actions"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#github-actions","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://docs.github.com/en/actions"}},[_v("GitHub Actions")]),_v(" is a platform that is used by RepoSense for running the test suite and is primarily used for continuous integration and testing. The test suite is stored in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".github/workflows/")]),_v(" and comprises of:")]),_v(" "),_c('ul',[_c('li',[_v("Unit tests (in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("src/tests/")]),_v(")")]),_v(" "),_c('li',[_v("System tests (in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("src/systemtest/")]),_v(")")]),_v(" "),_c('li',[_v("Frontend tests (in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("frontend/cypress/tests/")]),_v(")")])]),_v(" "),_c('h3',{attrs:{"id":"continuous-integration"}},[_v("Continuous integration"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#continuous-integration","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("All three types of tests in the test suite are run in a single GitHub Actions workflow called \"Continuous Integration\". The steps are defined in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/.github/workflows/integration.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("integration.yml")])]),_v(" and are split into two types of jobs:")]),_v(" "),_c('ol',[_c('li',[_v("Ubuntu/macOS/Windows JDK 11 ("),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("mainbuild")]),_v("): Runs both unit tests and system tests on JDK 11 running on supported Ubuntu, macOS and Windows versions. For Ubuntu, this job also produces a RepoSense report and the MarkBind documentation website for previewing.")]),_v(" "),_c('li',[_v("Cypress frontend tests ("),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("cypress")]),_v("): Runs only the frontend tests on JDK 11 running on Ubuntu.")])]),_v(" "),_c('p',[_v("The list of supported OS versions are "),_c('a',{attrs:{"href":"https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources"}},[_v("available on the GitHub Docs website")]),_v(". These jobs should be updated regularly whenever RepoSense supports newer versions of the Java Development Kit (JDK) as well as when new OS versions are made available (via the job OS matrix). Frontend tests are run separately to take advantage of parallel job execution.")]),_v(" "),_c('p',[_v("Some of the jobs execute some commands that are too complicated to be included in the workflow configuration files. Such commands are written in the form of a bash script and are located in the "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/tree/master/config/gh-actions"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("config/gh-actions")])]),_v(" folder.")]),_v(" "),_c('p',[_v("This workflow is run for both incoming pull requests to any branch as well as direct commits to any branch in the repository.")]),_v(" "),_c('p',[_v("Cypress frontend tests are run against reports generated from config files in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("frontend/cypress/config")]),_v(". It uses the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("cypress")]),_v(" branch of the RepoSense repository which is kept independent of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" and should be updated only when there are new frontend tests that need to be accommodated.")]),_v(" "),_c('h3',{attrs:{"id":"report-and-documentation-previews"}},[_v("Report and documentation previews"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#report-and-documentation-previews","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("For each pull request to any branch in the repository, a RepoSense report and the MarkBind documentation website is generated based on the code submitted in the pull request. This is to facilitate pull request reviewers in being able to quickly preview how the RepoSense report and/or the documentation website will change after the pull request is merged.")]),_v(" "),_c('p',[_v("Due to "),_c('a',{attrs:{"href":"https://securitylab.github.com/research/github-actions-preventing-pwn-requests"}},[_v("security considerations in preventing pwn requests")]),_v(", the deployment of the report and documentation previews were split across two workflows in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/pull/1411"}},[_v("pull request #1411")]),_v(":")]),_v(" "),_c('ol',[_c('li',[_v("Surge.sh pending build (defined in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/.github/workflows/pending.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("pending.yml")])]),_v("): Used for gathering information about the pull request and update the pull request checklist to indicate that the previews are pending.")]),_v(" "),_c('li',[_v("Surge.sh build preview (defined in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/.github/workflows/surge.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("surge.yml")])]),_v("): Used for actually deploying the RepoSense report and documentation website to Surge.sh and updating the pull request checklist to link to the preview websites.")])]),_v(" "),_c('p',[_v("The previews are recognised as GitHub deployments and are named "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("dashboard-$PRNUMBER")]),_v(" and "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("docs-$PRNUMBER")]),_v(", where "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("$PRNUMBER")]),_v(" is the pull request number. Once a preview is ready, the reviewer would be able to click on \"View deployment\" or \"Show environments\" in the pull request to open the preview websites.")]),_v(" "),_c('p',[_v("Both the \"Surge.sh pending build\" and \"Continuous Integration\" workflows produce an artifact respectively, which is then downloaded by the \"Surge.sh build preview\" workflow to be deployed to Surge.sh. Due to limitations in GitHub Actions in determining the workflow execution order, the \"Surge.sh pending build\" workflow is assumed to have been completed before the \"Continuous Integration\" workflow is completed.")]),_v(" "),_c('p',[_v("This task is not performed on commits to the repository, as there is no need to do so.")]),_v(" "),_c('p',[_v("After the pull request is closed or merged, the Surge.sh deployments are retained, while the GitHub environments for them are cleared by another workflow \"Clear deployments for closed pull requests\" (defined in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/.github/workflows/delete-deploy.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete-deploy.yml")])]),_v("). The workflow uses "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/config/gh-actions/delete-deploy.sh"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("delete-deploy.sh")])]),_v(" (found in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("config/gh-actions/")]),_v(" folder) to remove the environments on GitHub, and to leave a comment on the pull request with links to the Surge.sh previews for later reference.")]),_v(" "),_c('h3',{attrs:{"id":"github-pages"}},[_v("GitHub Pages"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#github-pages","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This task builds the MarkBind documentation website on every push to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch. The steps are defined in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/.github/workflows/gh-pages.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("gh-pages.yml")])]),_v(".")]),_v(" "),_c('h3',{attrs:{"id":"stale-pull-requests"}},[_v("Stale pull requests"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#stale-pull-requests","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This task automates the cleaning up of the pull requests by automatically marking inactive pull requests as stale and subsequently closing them. The steps and configurations are defined in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/.github/workflows/stale.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("stale.yml")])]),_v(" and the job is triggered automatically once per day.")]),_v(" "),_c('h2',{attrs:{"id":"codecov"}},[_v("Codecov"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#codecov","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://app.codecov.io/gh/reposense/RepoSense"}},[_v("Codecov")]),_v(" is a platform for checking the code coverage status of the project and the pull request patch. It runs automatically on each pull request and the settings are located in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/codecov.yml"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("codecov.yml")])]),_v(".")]),_v(" "),_c('h2',{attrs:{"id":"surge-sh"}},[_v("Surge.sh"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#surge-sh","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Surge.sh is a platform for hosting the RepoSense report and documentation preview builds. The deployment is automatically performed by the \"Surge.sh build preview\" job using the "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/config/gh-actions/deploy.sh"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("deploy.sh")])]),_v(" script in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("config/gh-actions/")]),_v(" folder.")]),_v(" "),_c('p',[_v("For authentication, two secrets are stored and used in GitHub Actions:")]),_v(" "),_c('ol',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("SURGE_LOGIN")]),_v(" - Holds the email address to use for the Surge.sh account")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("SURGE_TOKEN")]),_v(" - Holds the secret account token generated for the above account (generated using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("surge token")]),_v(")")])]),_v(" "),_c('p',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("surge")]),_v(" command automatically detects the existence of these two environment variables and use them for authentication when deploying the RepoSense report and documentation build previews.")]),_v(" "),_c('p',[_v("Currently, deployments are kept forever, even after the pull request is merged or closed. There is currently no existing functionality to automatically clean up deployments after they are no longer useful.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/index.html b/dg/index.html index 622cfd054d..2f3049bd2d 100644 --- a/dg/index.html +++ b/dg/index.html @@ -14,7 +14,7 @@

    Developer guide

    Contributing

    Thank you for your interest in contributing to RepoSense! We welcome PRs, especially from students.

    Here is a quick overview of how to get started.

    1. Set up the project on your computer (see the Setting up page)
    2. Learn the basics of the required background knowledge (see the Learning Basics page)
    3. Learn our workflow (see the Workflow page)
    4. Submit PRs as per the workflow. If you encounter any problems, post in our issue tracker.

    To gain a more solid understanding of the project implementation and workflow, you may want to start by working on issues that are suitable for first timers.

    We look forward to your PR. Happy coding!

    +

    Developer guide

    Contributing

    Thank you for your interest in contributing to RepoSense! We welcome PRs, especially from students.

    Here is a quick overview of how to get started.

    1. Set up the project on your computer (see the Setting up page)
    2. Learn the basics of the required background knowledge (see the Learning Basics page)
    3. Learn our workflow (see the Workflow page)
    4. Submit PRs as per the workflow. If you encounter any problems, post in our issue tracker.

    To gain a more solid understanding of the project implementation and workflow, you may want to start by working on issues that are suitable for first timers.

    We look forward to your PR. Happy coding!

    diff --git a/dg/index.page-vue-render.js b/dg/index.page-vue-render.js index 10aa33fd3b..7ca79950d2 100644 --- a/dg/index.page-vue-render.js +++ b/dg/index.page-vue-render.js @@ -17,6 +17,6 @@ with(this){return _c('div',{staticClass:"lead"},[_c('p',[_c('strong',[_v("Thank with(this){return _c('ol',[_c('li',[_c('strong',[_v("Set up the project")]),_v(" on your computer (see "),_c('a',{attrs:{"href":"/RepoSense/dg/settingUp.html"}},[_v("the "),_c('em',[_v("Setting up")]),_v(" page")]),_v(")")]),_v(" "),_c('li',[_c('strong',[_v("Learn the basics")]),_v(" of the required background knowledge (see "),_c('a',{attrs:{"href":"/RepoSense/dg/learningBasics.html"}},[_v("the "),_c('em',[_v("Learning Basics")]),_v(" page")]),_v(")")]),_v(" "),_c('li',[_c('strong',[_v("Learn our workflow")]),_v(" (see "),_c('a',{attrs:{"href":"/RepoSense/dg/workflow.html"}},[_v("the "),_c('em',[_v("Workflow")]),_v(" page")]),_v(")")]),_v(" "),_c('li',[_c('strong',[_v("Submit PRs")]),_v(" as per the workflow. If you encounter any problems, post in "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/issues"}},[_v("our issue tracker")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/learningBasics.html b/dg/learningBasics.html index 024ded6844..5c001f55ff 100644 --- a/dg/learningBasics.html +++ b/dg/learningBasics.html @@ -16,7 +16,7 @@ Search

    Learning the Basics

    This is a learning guide for developers who are new to RepoSense.

    Depending on what you know already and what you would like to work on (i.e., backend or frontend), you may find certain sections irrelevant to you and you can skip them accordingly.

    Backend

    This section is for developers who want to contribute to the backend of RepoSense. You may skip this section if you want to contribute as a pure frontend developer. Before you get started, you should have set up the project on your computer according to the Setting up page.

    The backend implementation of RepoSense is located in src/main.

    Step 1 Know Java

    The RepoSense backend is mostly written in Java 11.

    1. You need to have a basic knowledge of Java before getting started, including its syntax, API, and certain frameworks such as JUnit.
    2. Once you are familiar with the basic syntax, you may wish to learn more advanced topics such as concurrency, synchronization, and streams. These topics can help you to understand certain part of the backend implementation (concurrent cloning and analysis of multiple repositories, etc.). They are optional but you may find them useful when working on certain issues.

    Step 2 Learn the RepoSense backend architecture

    You may want to refer to the backend architecture to understand the RepoSense backend implementation logic.

    To gain a more concrete idea of how the backend works, you can use the IDE Debugger and run RepoSense under the debugging mode to trace through the steps of how arguments from command line and CSV files are parsed, how repositories are cloned and analyzed, and how the JSON files are generated.

    The information below is for Intellij. If you are using a different IDE, you may need to check the documentation of how to use the debugger separately.

    When tracing through the program execution, you can cross reference the architecture diagram and Javadoc of the class and method to check your understanding of the procedure.

    Step 3 Gain some hands-on experience

    Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense backend. You can do each in a separate branch in your local copy of the code.

    Task 1: Add a flag to pretty-print the JSON file


    Task 2: Add exception message during repository cloning to the summary view


    This is only for your practice. There is no need for you to commit this change and submit it in a pull request.

    Step 4 Next Step

    You can now proceed to learn the contributing workflow.

    Frontend

    This section is for developers who want to contribute to the frontend of RepoSense. You may skip this section if you want to contribute as a pure backend developer.

    The frontend implementation of RepoSense is located in frontend/src.

    Step 1 Learn the necessary tools

    It is necessary for you to learn the basics of Vue.js, Pug, and SCSS before working on the project.

    Vue.js

    Vue.js uses JavaScript as its programming language. Before learning Vue.js, you may need to first get yourself familiar with JavaScript syntax first. -You can refer to the Javascript documentation to learn the basic syntax. There are plenty of other resources available and please feel free to find the resource most suitable for you.

    RepoSense uses Vue.js (Vue3) in its front-end implementation. In particular, major user interface components, such as summary view, authorship view, and zoom view, are implemented as Vue components. The corresponding source files are in frontend/src.

    The guide above uses HTML as the component template, which is not the case with RepoSense. You may wish to learn more about Pug and its connection with HTML.

    Vuex

    RepoSense uses Vuex for the state management of the Vue components.

    Pug

    RepoSense uses Pug files as the template of each Vue component. The corresponding HTML templates will later be generated from the Pug files by spuild when generating the report.

    Since Pug is used to generate the HTML template, it is recommended that you have a basic knowledge of HTML before starting to learn Pug. Once you understand how HTML works, you can proceed to focus on how Pug is translated into HTML.

    Scss

    SCSS is used for styling the Pug template. The corresponding CSS will later be generated from the SCSS files by spuild when generating the report. The corresponding source files are in frontend/src/styles.

    It is recommended that you have a basic knowledge of CSS before starting to learn SCSS. Once you understand how CSS works, you can proceed to focus on how SCSS is translated into CSS.

    Step 2 Learn the RepoSense frontend architecture

    Step 3 Gain some hands-on experience

    Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense frontend. You can do each in a separate branch in your local copy of the code.

    Task 1: Highlight the selected author name in the summary view


    Task 2: Add tooltip for file path in authorship panel


    Task 3: Add tooltip for commit message title in zoom panel


    This is only for your practice. There is no need for you to commit this change and submit it in a pull request.

    Step 4 Next Step

    You can now proceed to learn the contributing workflow.

    DevOps

    If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the DevOps guide for more information.

    +You can refer to the Javascript documentation to learn the basic syntax. There are plenty of other resources available and please feel free to find the resource most suitable for you.

    RepoSense uses Vue.js (Vue3) in its front-end implementation. In particular, major user interface components, such as summary view, authorship view, and zoom view, are implemented as Vue components. The corresponding source files are in frontend/src.

    The guide above uses HTML as the component template, which is not the case with RepoSense. You may wish to learn more about Pug and its connection with HTML.

    Vuex

    RepoSense uses Vuex for the state management of the Vue components.

    Pug

    RepoSense uses Pug files as the template of each Vue component. The corresponding HTML templates will later be generated from the Pug files by spuild when generating the report.

    Since Pug is used to generate the HTML template, it is recommended that you have a basic knowledge of HTML before starting to learn Pug. Once you understand how HTML works, you can proceed to focus on how Pug is translated into HTML.

    Scss

    SCSS is used for styling the Pug template. The corresponding CSS will later be generated from the SCSS files by spuild when generating the report. The corresponding source files are in frontend/src/styles.

    It is recommended that you have a basic knowledge of CSS before starting to learn SCSS. Once you understand how CSS works, you can proceed to focus on how SCSS is translated into CSS.

    Step 2 Learn the RepoSense frontend architecture

    Step 3 Gain some hands-on experience

    Here are some small tasks for you to gain some basic knowledge of the code related to the RepoSense frontend. You can do each in a separate branch in your local copy of the code.

    Task 1: Highlight the selected author name in the summary view


    Task 2: Add tooltip for file path in authorship panel


    Task 3: Add tooltip for commit message title in zoom panel


    This is only for your practice. There is no need for you to commit this change and submit it in a pull request.

    Step 4 Next Step

    You can now proceed to learn the contributing workflow.

    DevOps

    If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the DevOps guide for more information.

    diff --git a/dg/learningBasics.page-vue-render.js b/dg/learningBasics.page-vue-render.js index 32cf36e164..90850ee6ea 100644 --- a/dg/learningBasics.page-vue-render.js +++ b/dg/learningBasics.page-vue-render.js @@ -110,6 +110,6 @@ with(this){return _c('h2',{attrs:{"id":"devops"}},[_v("DevOps"),_c('a',{staticCl with(this){return _c('p',[_v("If you want to understand and contribute to the DevOps aspect of RepoSense, you can refer to the "),_c('a',{attrs:{"href":"/RepoSense/dg/devOpsGuide.html"}},[_v("DevOps guide")]),_v(" for more information.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/projectManagement.html b/dg/projectManagement.html index e2360ba0c2..60e6c407be 100644 --- a/dg/projectManagement.html +++ b/dg/projectManagement.html @@ -17,7 +17,7 @@

    Project management

    This page contains information about project management tasks. The target audience is senior developers (and above).

    Merging PRs

    Making a release on GitHub

    Before making a release, please check the following prerequisites:

    To make a release for RepoSense on GitHub, please follow the Creating a release section in the GitHub Docs.

    Take note of the following when making the release according to the above guide:

    After making the release, please also remember to deploy the production website using the deploy guide.

    Deploying the production website

    We have two versions of the website:

    1. Production website at https://reposense.org
      • matches the latest released version
      • deployed manually after each new release
    2. Dev website at https://reposense.org/RepoSense
      • matches the latest master branch
      • deployed automatically by Travis whenever the master branch is updated

    The production website differs from the dev website in some ways, e.g.,

    MarkBind mainly manages these variations via the site.config file. That is why the site.config file in the release branch is slightly different from the one in the master branch.

    After each release, do the following steps to deploy the production website:

    1. Switch to the release branch
    2. cd docs
    3. markbind build
    4. markbind deploy (make sure you have the push access to https://github.com/reposense/reposense.github.io)
    5. After a few minutes, check https://reposense.org to ensure it has been updated as intended.

    Hot patching after the release

    If critical bugs are found in the release, take the following steps to hot patch it:

    1. Switch to the release branch.
    2. Implement the fixes, commit them, and create a pull request from your forked release branch to the upstream release branch.
    3. After merging, release a new version of RepoSense with the release branch according to the above guide.
    4. Merge the release branch back into the master branch by creating a separate pull request.
    +
    1. Switch to the release branch.
    2. In the terminal, change the directory to the project root directory.
    3. Run gradlew --version to check that the JDK version is 11.
    4. Run gradlew shadowJar, and the Jar file will be generated at {buildDir}/jar/.
    5. Check that the Jar file is working. You may need to check that the report can be generated from the Jar file both locally and remotely by following the Generating Reports Guide.

    After making the release, please also remember to deploy the production website using the deploy guide.

    Deploying the production website

    We have two versions of the website:

    1. Production website at https://reposense.org
    2. Dev website at https://reposense.org/RepoSense

    The production website differs from the dev website in some ways, e.g.,

    MarkBind mainly manages these variations via the site.config file. That is why the site.config file in the release branch is slightly different from the one in the master branch.

    After each release, do the following steps to deploy the production website:

    1. Switch to the release branch
    2. cd docs
    3. markbind build
    4. markbind deploy (make sure you have the push access to https://github.com/reposense/reposense.github.io)
    5. After a few minutes, check https://reposense.org to ensure it has been updated as intended.

    Hot patching after the release

    If critical bugs are found in the release, take the following steps to hot patch it:

    1. Switch to the release branch.
    2. Implement the fixes, commit them, and create a pull request from your forked release branch to the upstream release branch.
    3. After merging, release a new version of RepoSense with the release branch according to the above guide.
    4. Merge the release branch back into the master branch by creating a separate pull request.
    diff --git a/dg/projectManagement.page-vue-render.js b/dg/projectManagement.page-vue-render.js index 56c65a2138..cf0ffec3c6 100644 --- a/dg/projectManagement.page-vue-render.js +++ b/dg/projectManagement.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"fixed":""} with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-4",attrs:{"id":"project-management"}},[_c('span',[_v("Project management")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#project-management","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"lead"},[_c('p',[_v("This page contains information about project management tasks. The target audience is senior developers (and above).")])]),_v(" "),_c('h2',{attrs:{"id":"merging-prs"}},[_v("Merging PRs"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#merging-prs","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_c('strong',[_v("Use the 'squash and merge' option")]),_v(" unless the situation warrants a different option.")]),_v(" "),_c('li',[_c('strong',[_v("For the merge commit")]),_v(", follow conventions at "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/github.html"}},[_c('em',[_v("GitHub conventions")]),_v(" @SE-EDU")]),_v(".")])]),_v(" "),_c('h2',{attrs:{"id":"making-a-release-on-github"}},[_v("Making a release on GitHub"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#making-a-release-on-github","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Before making a release, please check the following prerequisites:")]),_v(" "),_c('ul',[_c('li',[_v("Ensure that you have "),_c('strong',[_v("JDK "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("11")])]),_v(" installed ("),_c('mark',[_v("Not other major release versions such as "),_c('strong',[_v("JDK "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("12")])]),_v(" or "),_c('strong',[_v("JDK "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("13")])])]),_v(").")]),_v(" "),_c('li',[_v("Ensure that the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("JAVA_HOME")]),_v(" environment variable is correctly set to your JDK installation directory. You can refer to the "),_c('a',{attrs:{"href":"https://docs.oracle.com/cd/E19182-01/821-0917/inst_jdk_javahome_t/index.html"}},[_v("JDK Installation Guide")]),_v(".")]),_v(" "),_c('li',[_v("Ensure that you have merged the "),_c('a',{attrs:{"href":"https://github.com/RepoSense/reposense"}},[_v("upstream")]),_v(" "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch into both the local and upstream "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch according to the following steps:\n"),_c('ol',[_c('li',[_v("In your local repository, reset your "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch to be exactly the same as the upstream "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch.")]),_v(" "),_c('li',[_v("Switch to the local "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch, and merge the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch into it with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("git merge master --no-ff")]),_v(" (no fast forward to keep the commit history for releases).")]),_v(" "),_c('li',[_v("Push the local "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch directly to the "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/tree/release"}},[_v("upstream "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch")]),_v(" (make sure you have the push access).")])])])]),_v(" "),_c('p',[_v("To make a release for RepoSense on GitHub, please follow the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Creating a release")]),_v(" section in the "),_c('a',{attrs:{"href":"https://docs.github.com/en/github/administering-a-repository/managing-releases-in-a-repository"}},[_v("GitHub Docs")]),_v("."),_c('br')]),_v(" "),_c('p',[_v("Take note of the following when making the release according to the above guide:")]),_v(" "),_c('ul',[_c('li',[_v("When entering a release version number, use semantic versioning with some small tweaks:\n"),_c('ul',[_c('li',[_v("Use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("MAJOR.MINOR")]),_v(" as the version number when the release includes new features and/or major changes.")]),_v(" "),_c('li',[_v("Use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("MAJOR.MINOR.PATCH")]),_v(" as the version number when the release only includes bug fixes and/or minor changes.")]),_v(" "),_c('li',[_v("Append "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("rc")]),_v(" to the version number to indicate that the release is a pre-release that is not ready to be used in production.")])])]),_v(" "),_c('li',[_v("Enter the release title as "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("RepoSense vxxx")]),_v(" where "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("xxx")]),_v(" is the version number. Enter the release description by referring to the previous "),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/releases"}},[_v("RepoSense releases")]),_v(".")]),_v(" "),_c('li',[_v("Before launching the release, generate the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("RepoSense.jar")]),_v(" file and attach it to the release.\n"),_c('ol',[_c('li',[_v("Switch to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch.")]),_v(" "),_c('li',[_v("In the terminal, change the directory to the project root directory.")]),_v(" "),_c('li',[_v("Run "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("gradlew --version")]),_v(" to check that the JDK version is 11.")]),_v(" "),_c('li',[_v("Run "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("gradlew shadowJar")]),_v(", and the Jar file will be generated at "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("{buildDir}/jar/")]),_v(".")]),_v(" "),_c('li',[_v("Check that the Jar file is working. You may need to check that the report can be generated from the Jar file both locally and remotely by following the "),_c('a',{attrs:{"href":"/RepoSense/ug/generatingReports.html"}},[_v("Generating Reports Guide")]),_v(".")])])])]),_v(" "),_c('p',[_v("After making the release, please also remember to deploy the production website using the "),_c('a',{attrs:{"href":"#deploying-the-production-website"}},[_v("deploy guide")]),_v(".")]),_v(" "),_c('h2',{attrs:{"id":"deploying-the-production-website"}},[_v("Deploying the production website"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#deploying-the-production-website","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("We have two versions of the website:")]),_v(" "),_c('ol',[_c('li',[_c('strong',[_v("Production website")]),_v(" at "),_c('a',{attrs:{"href":"https://reposense.org"}},[_v("https://reposense.org")]),_v(" "),_c('ul',[_c('li',[_v("matches the latest released version")]),_v(" "),_c('li',[_v("deployed manually after each new release")])])]),_v(" "),_c('li',[_c('strong',[_v("Dev website")]),_v(" at "),_c('a',{attrs:{"href":"https://reposense.org/RepoSense"}},[_v("https://reposense.org/RepoSense")]),_v(" "),_c('ul',[_c('li',[_v("matches the latest "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch")]),_v(" "),_c('li',[_v("deployed automatically by Travis whenever the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch is updated")])])])]),_v(" "),_c('p',[_v("The production website differs from the dev website in some ways, e.g.,")]),_v(" "),_c('ul',[_c('li',[_v("It has a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("CNAME")]),_v(" file (to indicate that it is the target destination for the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("reposense.org")]),_v(" domain name)")]),_v(" "),_c('li',[_v("Its DG pages show a warning that it is not the latest version of the DG.")])]),_v(" "),_c('p',[_v("MarkBind mainly manages these variations via the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("site.config")]),_v(" file. That is why the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("site.config")]),_v(" file in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch is slightly different from the one in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch.")]),_v(" "),_c('p',[_v("After each release, do the following steps to deploy the production website:")]),_v(" "),_c('ol',[_c('li',[_v("Switch to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("cd docs")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("markbind build")])]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("markbind deploy")]),_v(" (make sure you have the push access to "),_c('a',{attrs:{"href":"https://github.com/reposense/reposense.github.io"}},[_v("https://github.com/reposense/reposense.github.io")]),_v(")")]),_v(" "),_c('li',[_v("After a few minutes, check "),_c('a',{attrs:{"href":"https://reposense.org"}},[_v("https://reposense.org")]),_v(" to ensure it has been updated as intended.")])]),_v(" "),_c('h2',{attrs:{"id":"hot-patching-after-the-release"}},[_v("Hot patching after the release"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#hot-patching-after-the-release","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("If critical bugs are found in the release, take the following steps to hot patch it:")]),_v(" "),_c('ol',[_c('li',[_v("Switch to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch.")]),_v(" "),_c('li',[_v("Implement the fixes, commit them, and create a pull request from your forked "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch to the upstream "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch.")]),_v(" "),_c('li',[_v("After merging, release a new version of RepoSense with the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch according to the above guide.")]),_v(" "),_c('li',[_v("Merge the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("release")]),_v(" branch back into the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" branch by creating a separate pull request.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/report.html b/dg/report.html index 7803ee47a9..7747b84ccf 100644 --- a/dg/report.html +++ b/dg/report.html @@ -17,7 +17,7 @@

    HTML report

    The report's source files are located in frontend/src and are built by vue-cli before being packaged into the JAR file to be extracted as part of the report.

    Vue (pronounced /vjuː/, like view) is a progressive framework for building user interfaces. It is heavily utilized in the report to update the information in the various views dynamically. (Style guide available here, Developer tool available here). Vue lifecycle hooks are the defined methods that get executed in a particular stage of the Vue object lifespan. The following is the Vue lifecycle diagram taken from here indicating the hook sequence: vue lifecycle diagram

    The following is a snapshot of the report: report screenshot

    Report architecture

    The main Vue object (app.vue) is responsible for loading the report via an async call to api.ts, which parses summary.json. Its repos attribute is tied to the global window.REPOS, and is passed into the various other modules when the information is needed.

    The report interface is broken down into two main parts

    The summary view acts as the main report, which shows the various calculations.
    -The tabbed interface is responsible for loading various modules such as authorship and zoom to display additional information.

    Typescript and Vue files

    JSON report files

    App (app.vue)

    This contains the logic for the main VueJS object, app.vue, which is the entry point for the web application.

    Vuex in store.ts is used to pass the necessary data into the relevant modules.

    c-home, c-widget, c-summary, c-authorship, c-zoom, c-segment, and c-ramp are components embedded into the report and will render the corresponding content based on the data passed into it from Vuex.

    Loading of report information

    The main Vue object depends on the summary.json data to determine the right commits.json files to load into memory. This is handled by api.ts, which loads the relevant file information from the network files if available; otherwise, a report archive, archive.zip, has to be used.

    Once the relevant commit.json files are loaded, all the repo information will be passed into c-summary to be loaded in the summary view as the relevant ramp charts.

    Activating additional view modules

    Most activity or actions should happen within the module itself, but in the case where there is a need to spawn or alter the view of another module, an event is emitted from the first module to the Vuex store, which then handles the data received and passes it along to the relevant modules.

    Other than the global main Vue object, another global variable we have is the window.hashParams. This object is responsible for generating the relevant permalink for a specific view of the report's summary module.

    Data loader (api.ts)

    This is the module that is in charge of loading and parsing the data files generated as part of the report.

    Loading from ZIP file

    Due to security design, most modern browsers (e.g., Chrome) do not allow web pages to obtain local files using the directory alone. As such, a ZIP archive of the report information will be produced alongside the report generation.

    This archive will be used in place of the network files to load information into the report when the network files are unavailable.

    The API module will be handling all requests for all the JSON data files. If the network file is not available, the files will be obtained from the zip archive provided.

    Retrieving and parsing information

    After the JSON files are loaded from their respective sources, the data will be parsed as objects and included inside the global storage object, window.REPOS, in the right format.

    For the basic skeleton of window.REPOS, refer to the generated summary.json file in the report for more details.

    Home view (c-home.vue)

    The c-home module is in charge of rendering the main report, and renders c-resizer, c-summary, c-authorship and c-zoom.

    Widget view (c-widget.vue)

    The c-widget module is in charge of rendering the widget from the iframe and only renders c-summary. An additional prop, isWidgetMode, is passed to c-summary so it knows to render as a widget and omit unnecessary elements.

    Summary view (c-summary.vue)

    The c-summary module is in charge of loading the ramp charts from the corresponding commits.json.

    Initializing the data for the ramp charts

    The summary module is activated after the information is loaded from the main Vue.JS object. At creation, the repo attribute is populated with the window.REPOS object, which contains information loaded from summary.json.

    Filtering users and repositories

    The commits information is retrieved from the corresponding project folders for each repository. This information will be filtered and sorted before being passed into the template to be displayed as ramp charts.

    Authorship view (c-authorship.vue)

    The authorship module retrieves the relevant information from the corresponding authorship.json file if it is not yet loaded. If it has been loaded, the data will be written into window.REPOS and be read from there instead.

    Showing relevant information by authors

    The files will be filtered, picking only files the selected author has written in. The lines are then split into chunks of "touched" and "untouched" code segments displayed in the tab view which will be popped up on the right side of the screen.

    Zoom view (c-zoom.vue)

    The c-zoom module is in charge of filtering and displaying the commits from the ramp chart's selected sub-range.

    Ramp view (c-ramp.vue)

    The c-ramp module is responsible for receiving the relevant information from c-summary and generating ramp charts that contain ramp slices.

    Padding for dates

    For ramps between the date ranges, the slices will be selected and it will be pre and post padded with empty slices to align the ramp slice between the sinceDate and untilDate. The ramps will then be rendered with the slices in the right position.

    Segment view (c-segment.vue)

    The c-segment module is used as a component in c-authorship. It separates the code in terms of "touched" and "untouched" segments and only loads each "untouched" segment when it is toggled.

    +The tabbed interface is responsible for loading various modules such as authorship and zoom to display additional information.

    Typescript and Vue files

    JSON report files

    App (app.vue)

    This contains the logic for the main VueJS object, app.vue, which is the entry point for the web application.

    Vuex in store.ts is used to pass the necessary data into the relevant modules.

    c-home, c-widget, c-summary, c-authorship, c-zoom, c-segment, and c-ramp are components embedded into the report and will render the corresponding content based on the data passed into it from Vuex.

    Loading of report information

    The main Vue object depends on the summary.json data to determine the right commits.json files to load into memory. This is handled by api.ts, which loads the relevant file information from the network files if available; otherwise, a report archive, archive.zip, has to be used.

    Once the relevant commit.json files are loaded, all the repo information will be passed into c-summary to be loaded in the summary view as the relevant ramp charts.

    Activating additional view modules

    Most activity or actions should happen within the module itself, but in the case where there is a need to spawn or alter the view of another module, an event is emitted from the first module to the Vuex store, which then handles the data received and passes it along to the relevant modules.

    Other than the global main Vue object, another global variable we have is the window.hashParams. This object is responsible for generating the relevant permalink for a specific view of the report's summary module.

    Data loader (api.ts)

    This is the module that is in charge of loading and parsing the data files generated as part of the report.

    Loading from ZIP file

    Due to security design, most modern browsers (e.g., Chrome) do not allow web pages to obtain local files using the directory alone. As such, a ZIP archive of the report information will be produced alongside the report generation.

    This archive will be used in place of the network files to load information into the report when the network files are unavailable.

    The API module will be handling all requests for all the JSON data files. If the network file is not available, the files will be obtained from the zip archive provided.

    Retrieving and parsing information

    After the JSON files are loaded from their respective sources, the data will be parsed as objects and included inside the global storage object, window.REPOS, in the right format.

    For the basic skeleton of window.REPOS, refer to the generated summary.json file in the report for more details.

    Home view (c-home.vue)

    The c-home module is in charge of rendering the main report, and renders c-resizer, c-summary, c-authorship and c-zoom.

    Widget view (c-widget.vue)

    The c-widget module is in charge of rendering the widget from the iframe and only renders c-summary. An additional prop, isWidgetMode, is passed to c-summary so it knows to render as a widget and omit unnecessary elements.

    Summary view (c-summary.vue)

    The c-summary module is in charge of loading the ramp charts from the corresponding commits.json.

    Initializing the data for the ramp charts

    The summary module is activated after the information is loaded from the main Vue.JS object. At creation, the repo attribute is populated with the window.REPOS object, which contains information loaded from summary.json.

    Filtering users and repositories

    The commits information is retrieved from the corresponding project folders for each repository. This information will be filtered and sorted before being passed into the template to be displayed as ramp charts.

    Authorship view (c-authorship.vue)

    The authorship module retrieves the relevant information from the corresponding authorship.json file if it is not yet loaded. If it has been loaded, the data will be written into window.REPOS and be read from there instead.

    Showing relevant information by authors

    The files will be filtered, picking only files the selected author has written in. The lines are then split into chunks of "touched" and "untouched" code segments displayed in the tab view which will be popped up on the right side of the screen.

    Zoom view (c-zoom.vue)

    The c-zoom module is in charge of filtering and displaying the commits from the ramp chart's selected sub-range.

    Ramp view (c-ramp.vue)

    The c-ramp module is responsible for receiving the relevant information from c-summary and generating ramp charts that contain ramp slices.

    Padding for dates

    For ramps between the date ranges, the slices will be selected and it will be pre and post padded with empty slices to align the ramp slice between the sinceDate and untilDate. The ramps will then be rendered with the slices in the right position.

    Segment view (c-segment.vue)

    The c-segment module is used as a component in c-authorship. It separates the code in terms of "touched" and "untouched" segments and only loads each "untouched" segment when it is toggled.

    diff --git a/dg/report.page-vue-render.js b/dg/report.page-vue-render.js index fc007c3ffd..e1f1bfe0b6 100644 --- a/dg/report.page-vue-render.js +++ b/dg/report.page-vue-render.js @@ -146,6 +146,6 @@ with(this){return _c('h2',{attrs:{"id":"segment-view-c-segment-vue"}},[_v("Segme with(this){return _c('p',[_v("The "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("c-segment")]),_v(" module is used as a component in "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("c-authorship")]),_v(". It separates the code in terms of \"touched\" and \"untouched\" segments and only loads each \"untouched\" segment when it is toggled.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/settingUp.html b/dg/settingUp.html index c41e1ff205..ec3afff714 100644 --- a/dg/settingUp.html +++ b/dg/settingUp.html @@ -14,7 +14,7 @@

    Setting up

    Prerequisites:

    • JDK 11.0.21+9 up to 17 (download ).

    • Node.js 18 up to the latest minor version of 19 (download ).

    • Git 2.23 or later (download ).

      Type java -version, node -v and git --version respectively on your OS terminal and ensure that you have the correct version of each prerequisite installed.

    Getting the code

    1. Fork the reposense/reposense repo.
    2. Clone the fork to your computer.

    Setting up the IDE

    The recommended IDE is Intellij IDEA. While it is not compulsory to use it, note that we will not be able to help you troubleshoot IDE problems if you use any other IDE.

    1. Ensure you have configured IDEA for the correct JDK, as explained in this tutorial.
    2. Import the project as a Gradle project, as explained in this tutorial.

    Verifying the setup

    This project is already configured to use Gradle for build automation. If you are new to Gradle, see this tutorial to learn how to use it.

    1. Open a command prompt and navigate to the project root.
    2. Run gradlew clean build (./gradlew clean build if you on a Unix-like OS), and ensure that it finishes with a BUILD SUCCESSFUL message.
    3. Run the tests using the gradlew test systemtest command and ensure it succeeds too.
    4. You can also try running the app using code, as given in the panel below.

    Before you start coding

    ... read the Workflow section.

    +

    Setting up

    Prerequisites:

    Getting the code

    1. Fork the reposense/reposense repo.
    2. Clone the fork to your computer.

    Setting up the IDE

    The recommended IDE is Intellij IDEA. While it is not compulsory to use it, note that we will not be able to help you troubleshoot IDE problems if you use any other IDE.

    1. Ensure you have configured IDEA for the correct JDK, as explained in this tutorial.
    2. Import the project as a Gradle project, as explained in this tutorial.

    Verifying the setup

    This project is already configured to use Gradle for build automation. If you are new to Gradle, see this tutorial to learn how to use it.

    1. Open a command prompt and navigate to the project root.
    2. Run gradlew clean build (./gradlew clean build if you on a Unix-like OS), and ensure that it finishes with a BUILD SUCCESSFUL message.
    3. Run the tests using the gradlew test systemtest command and ensure it succeeds too.
    4. You can also try running the app using code, as given in the panel below.

    Before you start coding

    ... read the Workflow section.

    diff --git a/dg/settingUp.page-vue-render.js b/dg/settingUp.page-vue-render.js index 6162cc34d1..d519d66382 100644 --- a/dg/settingUp.page-vue-render.js +++ b/dg/settingUp.page-vue-render.js @@ -44,6 +44,6 @@ with(this){return _c('h2',{attrs:{"id":"before-you-start-coding"}},[_v("Before y with(this){return _c('p',[_v("... read the "),_c('a',{attrs:{"href":"/RepoSense/dg/workflow.html"}},[_v("Workflow")]),_v(" section.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/styleGuides.html b/dg/styleGuides.html index c6ca09049b..c1c4e25ae3 100644 --- a/dg/styleGuides.html +++ b/dg/styleGuides.html @@ -128,7 +128,7 @@ class Foo { name: string; } - + diff --git a/dg/styleGuides.page-vue-render.js b/dg/styleGuides.page-vue-render.js index a44157671b..3a39e8fef3 100644 --- a/dg/styleGuides.page-vue-render.js +++ b/dg/styleGuides.page-vue-render.js @@ -8,6 +8,6 @@ with(this){return _c('div',{attrs:{"id":"app"}},[_c('header',{attrs:{"fixed":""} with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-4",attrs:{"id":"appendix-style-guides"}},[_c('span',[_v("Appendix: Style guides")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#appendix-style-guides","onclick":"event.stopPropagation()"}})]),_v(" "),_c('div',{staticClass:"lead"},[_c('p',[_v("Our coding standards are mostly based on those at "),_c('a',{attrs:{"href":"https://se-education.org/guides"}},[_v("se-education.org/guides")]),_v(".")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/css.html"}},[_c('strong',[_v("CSS")]),_v(" coding standard")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/files.html"}},[_c('strong',[_v("Files/folders")]),_v(" naming conventions")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/html.html"}},[_c('strong',[_v("HTML")]),_v(" coding standard")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/markdown.html"}},[_c('strong',[_v("Markdown/MarkBind")]),_v(" coding standard")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/index.html"}},[_c('strong',[_v("Java")]),_v(" coding standard")])]),_v(" "),_c('li',[_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/javascript.html"}},[_c('strong',[_v("JavaScript")]),_v(" coding standard")])]),_v(" "),_c('li',[_c('strong',[_v("TypeScript")]),_v(": In addition to the JavaScript coding standard, follow the "),_c('a',{attrs:{"href":"https://typescript-eslint.io/rules/"}},[_c('strong',[_v("recommended ESLint rules")])]),_v(" and the formatting rules "),_c('a',{attrs:{"href":"#typescript-specific-formatting"}},[_v("described below")]),_v(".")]),_v(" "),_c('li',[_c('strong',[_v("Vue Components")]),_v(": Follow the "),_c('a',{attrs:{"href":"https://vuejs.org/style-guide/"}},[_c('strong',[_v("Vue style guide")])]),_v(", up to the "),_c('strong',[_v("Recommended")]),_v(" section.")]),_v(" "),_c('li',[_c('strong',[_v("Documentation")]),_v(": Follow the "),_c('a',{attrs:{"href":"https://developers.google.com/style"}},[_c('strong',[_v("Google developer documentation style guide")])]),_v(".")])]),_v(" "),_c('h2',{attrs:{"id":"note-on-ternary-operators"}},[_v("Note on Ternary Operators:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#note-on-ternary-operators","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Ternary operators can be used to shorten if-else blocks such as this:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs java"}},[_c('span',[_v("LocalDateTime min = ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime();\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("if")]),_v(" (!commitInfos.isEmpty()) {\n")]),_c('span',[_v(" min = commitInfos.get("),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("0")]),_v(").getTime();\n")]),_c('span',[_v("}\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" min;\n")])])]),_c('p',[_v("The result would look something like this:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("return")]),_v(" (commitInfos.isEmpty())\n")]),_c('span',[_v(" ? ARBITRARY_FIRST_COMMIT_DATE_UTC.withZoneSameInstant(zoneId).toLocalDateTime()\n")]),_c('span',[_v(" : commitInfos.get("),_c('span',{pre:true,attrs:{"class":"hljs-number"}},[_v("0")]),_v(").getTime();\n")])])]),_c('p',[_v("To preserve readability, it is recommended that if-else blocks should only be\nconverted to ternary operators if the resultant code can be kept at most 3 lines long\n(in accordance to the coding standard).")]),_v(" "),_c('h2',{attrs:{"id":"additional-javadoc-requirements"}},[_v("Additional Javadoc requirements:"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#additional-javadoc-requirements","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("In addition to what has been mentioned in the "),_c('a',{attrs:{"href":"https://se-education.org/guides/conventions/java/index.html"}},[_c('strong',[_v("Java")]),_v(" coding standard (SE-EDU)")]),_v(" and "),_c('a',{attrs:{"href":"https://google.github.io/styleguide/javaguide.html"}},[_c('strong',[_v("Google Java Style Guide")])]),_v(", we also stipulate the following standards for Javadoc:")]),_v(" "),_c('ul',[_c('li',[_v("If Javadoc is written for a method, all input parameters should be described in the Javadoc, either in the description with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@code tags")]),_v(" or through "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@param")]),_v(" block tags.\n"),_c('ul',[_c('li',[_v("If "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@param")]),_v(" block tags are used, they must be used for all parameters.")]),_v(" "),_c('li',[_v("This is not necessary (although still recommended) for methods with "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@Override")]),_v(" annotations if Javadoc is used. However, if the method that is being overriden is part of your code and has Javadoc, all parameters must be described.")])])])]),_v(" "),_c('p',[_v("Negative Examples:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Not okay (Only mentions zoneId parameter):")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Returns a {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@link")]),_v(" LocalDateTime} object adjusted for timezone given by {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" zoneId}.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" LocalDateTime "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("adjustTimeZone")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(LocalDateTime sinceDate, ZoneId zoneId)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Code here")]),_v("\n")]),_c('span',[_v("}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Not okay (@param tag used only for zoneId)")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Returns a {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@link")]),_v(" LocalDateTime} object by adjusting {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" sinceDate}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * to the timezone given by {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" zoneId}.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" *")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@param")]),_v(" zoneId The timezone ID to adjust the sinceDate to.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" LocalDateTime "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("adjustTimeZone")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(LocalDateTime sinceDate, ZoneId zoneId)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Code here")]),_v("\n")]),_c('span',[_v("}\n")])])]),_c('p',[_v("Positive Example #1:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Okay (No @param tags):")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Returns a {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@link")]),_v(" LocalDateTime} object by adjusting {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" sinceDate}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * to the timezone given by {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" zoneId}.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" LocalDateTime "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("adjustTimeZone")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(LocalDateTime sinceDate, ZoneId zoneId)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Code here")]),_v("\n")]),_c('span',[_v("}\n")])])]),_c('p',[_v("Positive Example #2:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Okay (@param tags used for all inputs):")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Returns a {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@link")]),_v(" LocalDateTime} object by adjusting {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" sinceDate}")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * to the timezone given by {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" zoneId}.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" *")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@param")]),_v(" sinceDate The date prior to the timezone conversion.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@param")]),_v(" zoneId The timezone ID to adjust the sinceDate to.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" LocalDateTime "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("adjustTimeZone")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(LocalDateTime sinceDate, ZoneId zoneId)")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("//Code here")]),_v("\n")]),_c('span',[_v("}\n")])])]),_c('ul',[_c('li',[_v("Within the main code, if an exception is thrown in a method (both header and body) for which Javadoc is written, a "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@throws")]),_v(" tag must be used to describe how the exception is likely to arise.\n"),_c('ul',[_c('li',[_v("This requirement does not apply to test code.")]),_v(" "),_c('li',[_v("One "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@throws")]),_v(" tag per unique exception.")]),_v(" "),_c('li',[_v("The order of exceptions in the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@throws")]),_v(" tag block should match that of the method's "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("throws")]),_v(" statement.")])])])]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs java"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Not okay (order of exceptions in tag block and method signature do not match):")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Returns a {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@link")]),_v(" LocalDateTime} object from {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" dateString}.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" *")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@throws")]),_v(" ParseException if {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" dateString} cannot be parsed.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@throws")]),_v(" NullPointerException if {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" dateString} is null.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" LocalDateTime "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("parseDate")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(String dateString)")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("throws")]),_v(" NullPointerException, ParseException ")]),_v("{\n")]),_c('span',[_v(" String trimmedString = dateString.toUpperCase(); "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// NullPointerException may happen here.")]),_v("\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Code here")]),_v("\n")]),_c('span',[_v("}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Should be:")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("/**")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * Returns a {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@link")]),_v(" LocalDateTime} object from {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" dateString}.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" *")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@throws")]),_v(" NullPointerException if {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" dateString} is null.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" * "),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@throws")]),_v(" ParseException if {"),_c('span',{pre:true,attrs:{"class":"hljs-doctag"}},[_v("@code")]),_v(" dateString} cannot be parsed.")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v(" */")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("public")]),_v(" LocalDateTime "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("parseDate")]),_c('span',{pre:true,attrs:{"class":"hljs-params"}},[_v("(String dateString)")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("throws")]),_v(" NullPointerException, ParseException ")]),_v("{\n")]),_c('span',[_v(" String trimmedString = dateString.toUpperCase(); "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// NullPointerException may happen here.")]),_v("\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// Code here")]),_v("\n")]),_c('span',[_v("}\n")])])]),_c('h2',{attrs:{"id":"typescript-specific-formatting"}},[_v("TypeScript specific formatting"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#typescript-specific-formatting","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("For TypeScript specific code, such as within an "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("interface")]),_v(" or type annotations, we also stipulate the following standards:")]),_v(" "),_c('ul',[_c('li',[_v("Use semicolons as delimiters for TypeScript interfaces and types.")])]),_v(" "),_c('p',[_v("Negative Examples:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs typescript"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// missing semicolon delimiter")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("interface")]),_v(" Foo {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(": "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v("\n")]),_c('span',[_v(" greet(): "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v("\n")]),_c('span',[_v("}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// using incorrect delimiter")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("interface")]),_v(" Foo {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(": "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(",\n")]),_c('span',[_v(" greet(): "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(",\n")]),_c('span',[_v("}\n")])])]),_c('p',[_v("Positive Example:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs typescript"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-comment"}},[_v("// semicolon delimiter")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("interface")]),_v(" Foo {\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(": "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(";\n")]),_c('span',[_v(" greet(): "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(";\n")]),_c('span',[_v("}\n")])])]),_c('ul',[_c('li',[_v("For type annotations, use a space after but not before.")])]),_v(" "),_c('p',[_v("Negative Examples:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs typescript"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("let")]),_v(" foo:"),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(" = "),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"bar\"")]),_v(";\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("let")]),_v(" foo :"),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(" = "),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"bar\"")]),_v(";\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("let")]),_v(" foo : "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(" = "),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"bar\"")]),_v(";\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("function")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("foo")]),_v("("),_c('span',{pre:true,attrs:{"class":"hljs-params"}}),_v("):"),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("string")]),_v(" ")]),_v("{}\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("function")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("foo")]),_v("("),_c('span',{pre:true,attrs:{"class":"hljs-params"}}),_v(") :"),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("string")]),_v(" ")]),_v("{}\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("function")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("foo")]),_v("("),_c('span',{pre:true,attrs:{"class":"hljs-params"}}),_v(") : "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("string")]),_v(" ")]),_v("{}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-class"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("class")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("Foo")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(":"),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(";\n")]),_c('span',[_v("}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-class"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("class")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("Foo")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(" :"),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(";\n")]),_c('span',[_v("}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-class"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("class")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("Foo")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(" : "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(";\n")]),_c('span',[_v("}\n")])])]),_c('p',[_v("Positive Examples:")]),_v(" "),_c('pre',[_c('code',{pre:true,attrs:{"class":"hljs typescript"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("let")]),_v(" foo: "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(" = "),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"bar\"")]),_v(";\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-function"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("function")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("foo")]),_v("("),_c('span',{pre:true,attrs:{"class":"hljs-params"}}),_v("): "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("string")]),_v(" ")]),_v("{}\n")]),_c('span',[_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-class"}},[_c('span',{pre:true,attrs:{"class":"hljs-keyword"}},[_v("class")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-title"}},[_v("Foo")]),_v(" ")]),_v("{\n")]),_c('span',[_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("name")]),_v(": "),_c('span',{pre:true,attrs:{"class":"hljs-built_in"}},[_v("string")]),_v(";\n")]),_c('span',[_v("}\n")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/dg/workflow.html b/dg/workflow.html index 226d174e3b..dcc547f9fc 100644 --- a/dg/workflow.html +++ b/dg/workflow.html @@ -22,7 +22,7 @@ Cypress Test Runner

    Read Cypress's Documentation to familiarize yourself with its syntax and Cypress's debugging guide to tackle problems with your tests.

    Note that it is compulsory to add tests for the new front-end changes that you made to prevent regression bugs, except for trivial changes that are unlikely to cause any regression or other situations where testing does not apply to the change.

    Running tests

    To run all tests locally, run gradlew frontendTest.

    If you encountered an invalid browser error, ensure that you have Chrome installed in the default installation directory. Otherwise, follow the instructions here to create symbolic links so Cypress can locate Chrome in your system.

    Testing (back-end)

    The back-end tests can be found at [project root]/systemtest and [project root]/test.

    Running tests

    To run all the system tests, run gradlew systemtest.

    To run all the unit and integration tests, run gradlew test.

    Writing documentation

    This project uses MarkBind for documentation. Follow this tutorial to learn how to use MarkBind for updating project documentation.

    To show some content only in the , add the tags="production" attribute to the HTML element enclosing the content. Similarly, tags="dev" will make the content appear only in the .

    <span tags="production">This will appear in the production website only.</span>
     <span tags="dev">This will appear in the dev website only.</span>
     This will appear in both sites.
    -
    + diff --git a/dg/workflow.page-vue-render.js b/dg/workflow.page-vue-render.js index 61778e8c5e..3bf8764c95 100644 --- a/dg/workflow.page-vue-render.js +++ b/dg/workflow.page-vue-render.js @@ -101,6 +101,6 @@ with(this){return _c('p',[_c('strong',[_v("This project uses "),_c('a',{attrs:{" with(this){return _c('pre',[_c('code',{pre:true,attrs:{"class":"hljs html"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-tag"}},[_v("<"),_c('span',{pre:true,attrs:{"class":"hljs-name"}},[_v("span")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("tags")]),_v("="),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"production\"")]),_v(">")]),_v("This will appear in the production website only."),_c('span',{pre:true,attrs:{"class":"hljs-tag"}},[_v("")]),_v("\n")]),_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-tag"}},[_v("<"),_c('span',{pre:true,attrs:{"class":"hljs-name"}},[_v("span")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("tags")]),_v("="),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"dev\"")]),_v(">")]),_v("This will appear in the dev website only."),_c('span',{pre:true,attrs:{"class":"hljs-tag"}},[_v("")]),_v("\n")]),_c('span',[_v("This will appear in both sites.\n")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/index.html b/index.html index 4d39c28548..e96e3949fd 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@

    RepoSense

    Visualize programmer activities across Git repositories... -

    RepoSense overview

    RepoSense can generate interactive visualizations of programmer activities, even across multiple repositories. It's ideal for educators and managers to get insights into the programming activities of their mentees. The visualizations can be easily shared with others (e.g., as an online dashboard), and updating the visualizations periodically can be automated.

    Some example insights RepoSense can provide:

    Insights about the code

    • Which part of the code was written by Tom? How many lines? How many files?
    • Which test cases were written by Kim?
    • Which commit messages were written by Serene?

    Insights about the type of work

    • Which portion of Jacob's code is documentation?
    • Who hasn't written any test code yet?
    • Which project did Jolene contribute to in the last month?

    Insights about the timing of work

    • Who is putting in the consistent effort?
    • Who waits till the deadline to do the work?
    • Who hasn't started any work yet?

    Insights based on comparisons

    • Which programmers/teams are falling behind?
    • How does everyone compare in their front-end coding work over the past two weeks?
    • Who are the top 10 code contributors?
    +

    RepoSense overview

    RepoSense can generate interactive visualizations of programmer activities, even across multiple repositories. It's ideal for educators and managers to get insights into the programming activities of their mentees. The visualizations can be easily shared with others (e.g., as an online dashboard), and updating the visualizations periodically can be automated.

    Some example insights RepoSense can provide:

    Insights about the code

    Insights about the type of work

    Insights about the timing of work

    Insights based on comparisons

    diff --git a/index.page-vue-render.js b/index.page-vue-render.js index 6cecc5aee9..74b2ab1bea 100644 --- a/index.page-vue-render.js +++ b/index.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('ul',[_c('li',[_v("Which programmers/teams are falling behi with(this){return _c('div',{staticClass:"jumbotron jumbotron-fluid pt-2"},[_c('div',{staticClass:"container"},[_c('div',{staticClass:"container pt-2"},[_c('div',{staticClass:"row"}),_v(" "),_c('div',{staticClass:"row"},[_c('div',{staticClass:"col-sm"},[_c('p',[_c('a',{attrs:{"href":"/RepoSense/showcase.html"}},[_c('strong',[_v("SHOWCASE")]),_v(" of use cases")])]),_v(" "),_c('p',[_c('a',{attrs:{"href":"/RepoSense/about.html"}},[_c('strong',[_v("ABOUT")]),_v(" us")])]),_v(" "),_c('p',[_c('a',{attrs:{"href":"/RepoSense/contact.html"}},[_c('strong',[_v("CONTACT")]),_v(" us")])]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense"}},[_c('strong',[_c('span',{staticClass:"fab fa-github",attrs:{"aria-hidden":"true"}}),_v(" GitHub")])])]),_v(" "),_c('hr'),_v(" "),_c('small',[_c('p',[_v("This website was built using MarkBind.")]),_v(" "),_c('p',[_c('a',{attrs:{"href":"http://markbind.org"}},[_c('img',{attrs:{"src":"https://markbind.org/images/logo-lightbackground.png","width":"150"}})])]),_v(" "),_c('p',[_v("Deploy previews are powered by Netlify and Surge.")]),_v(" "),_c('p',[_c('a',{attrs:{"href":"https://www.netlify.com"}},[_c('img',{attrs:{"src":"https://www.netlify.com/img/global/badges/netlify-color-bg.svg"}})]),_v(" "),_c('a',{attrs:{"href":"https://surge.sh"}},[_c('img',{attrs:{"width":"55px","src":"https://surge.sh/images/logos/svg/surge-logo.svg"}})])])]),_c('p')]),_v(" "),_c('div',{staticClass:"col-sm"},[_c('p',[_c('strong',[_c('strong',[_v("USER GUIDE")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/index.html"}},[_c('strong',[_v("Overview")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/generatingReports.html"}},[_c('strong',[_v("Generating reports")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/usingReports.html"}},[_c('strong',[_v("Using reports")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/customizingReports.html"}},[_c('strong',[_v("Customizing reports")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/sharingReports.html"}},[_c('strong',[_v("Sharing reports")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Appendices")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/cli.html"}},[_v("CLI syntax reference")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html"}},[_v("Config files format")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/authorConfigSyntax.html"}},[_v("Advanced syntax: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("author-config.csv")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/usingAuthorTags.html"}},[_v("Using "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("@@author")]),_v(" tags")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/withNetlify.html"}},[_v("RepoSense with Netlify")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/withGithubActions.html"}},[_v("RepoSense with GitHub Actions")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/withTravis.html"}},[_v("RepoSense with Travis")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/runSh.html"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("run.sh")]),_v(" format")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/faq.html"}},[_v("FAQ")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/ug/troubleshooting.html"}},[_v("Troubleshooting")])])])])])])]),_v(" "),_c('div',{staticClass:"col-sm"},[_c('p',[_c('strong',[_c('strong',[_v("DEVELOPER GUIDE")])])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/index.html"}},[_c('strong',[_v("Contributing")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/settingUp.html"}},[_c('strong',[_v("Setting up")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/learningBasics.html"}},[_c('strong',[_v("Learning the basics")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/workflow.html"}},[_c('strong',[_v("Workflow")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Design and implementation")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/architecture.html"}},[_v("Architecture")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/report.html"}},[_v("HTML report")])])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/projectManagement.html"}},[_c('strong',[_v("Project management")])])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/devOpsGuide.html"}},[_c('strong',[_v("DevOps guide")])])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Appendices")])]),_v(" "),_c('ul',[_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/cli.html"}},[_v("CLI syntax reference")])])]),_v(" "),_c('li',[_c('p',[_c('a',{attrs:{"href":"/RepoSense/dg/styleGuides.html"}},[_v("Style guides")])])])])])])])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/showcase.html b/showcase.html index d95b856ae6..998d783d4a 100644 --- a/showcase.html +++ b/showcase.html @@ -14,7 +14,7 @@

    Showcase

    Case 1: Monitoring student programmers (individual projects)

    • Scenario: RepoSense is used to monitor a Software Engineering course in which students build a project over 8 weeks.

    • Links: report | repo containing the settings

    • Example usages:

      • To compare students based on the amount of code written, we can sort by contribution, as done in this view.
      • This view shows us code written by a specific student.

    Case 2: Monitoring student programmers (team projects)

    • Scenario: Similar to case 1 above, but this time students are doing team projects.

    • Links: report | settings

    • Example usages:

      • To find the breakdown of the work done, we can tick the breakdown by file type checkbox, as shown in this view. After that, we can filter out certain file types by un-ticking the file type.
      • To find how teams compare in terms of total work done, we can tick the merge all groups check-box and sort groups by Contribution, as seen in this view. Also, note how to reduce clutter.
      • This view shows the activities near the submission deadline of 8 November 2021 (note how some have overshot the deadline and some others show a frenzy of activities very near to the deadline).

    Case 3: Monitoring student programmers (multiple external projects)

    • Scenario: Similar to cases 1 and 2 above, but this time, each student works on multiple projects. Furthermore, most projects are external OSS projects, not within the control of the teacher.

    • Links: report | settings

    • Example usages:

      • This view shows the commit messages written by a specific student.
      • Note how we can use the group by drop-down to organize activities around projects or individual authors.
      • Similarly, we can use the merge all groups check-box to see the sum of activities in a specific project or by a specific student.
    +

    Showcase

    Case 1: Monitoring student programmers (individual projects)

    Case 2: Monitoring student programmers (team projects)

    Case 3: Monitoring student programmers (multiple external projects)

    diff --git a/showcase.page-vue-render.js b/showcase.page-vue-render.js index c05cc23828..e785ee4904 100644 --- a/showcase.page-vue-render.js +++ b/showcase.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('h3',{attrs:{"id":"case-3-monitoring-student-programmers-mu with(this){return _c('ul',[_c('li',[_c('p',[_c('strong',[_v("Scenario:")]),_v(" Similar to cases 1 and 2 above, but this time, each student works on multiple projects. Furthermore, most projects are external OSS projects, not within the control of the teacher.")])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Links:")]),_v(" "),_c('a',{attrs:{"href":"https://nus-cs3281.github.io/2020-dashboard/?search=&sort=groupTitle&sortWithin=title&since=2019-12-01&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false"}},[_v("report")]),_v(" | "),_c('a',{attrs:{"href":"https://github.com/nus-cs3281/2020-dashboard"}},[_v("settings")])])]),_v(" "),_c('li',[_c('p',[_c('strong',[_v("Example usages:")])]),_v(" "),_c('ul',[_c('li',[_c('a',{attrs:{"href":"https://nus-cs3281.github.io/2020-dashboard/?search=&sort=groupTitle&sortWithin=title&since=2019-12-01&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=false&tabOpen=true&tabType=zoom&zA=anubh-v&zR=CATcher-org%2FCATcher%5Bmaster%5D&zACS=153.40466101694915&zS=2019-12-01&zFS=&zU=2021-06-15&zMG=false&zFTF=commit&zFGS=groupByRepos&zFR=false"}},[_v("This view")]),_v(" shows the commit messages written by a specific student.")]),_v(" "),_c('li',[_v("Note how we can use the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("group by")]),_v(" drop-down to organize activities around projects or individual authors.")]),_v(" "),_c('li',[_v("Similarly, we can use the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("merge all groups")]),_v(" check-box to see the sum of activities in a specific project or by a specific student.")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/authorConfigSyntax.html b/ug/authorConfigSyntax.html index 593ce4530d..099fc1a4ad 100644 --- a/ug/authorConfigSyntax.html +++ b/ug/authorConfigSyntax.html @@ -14,7 +14,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: author-config.csv advanced syntax

    Given below are the advanced syntax available for author-config.csv.

    Multiple Repository's Location per author

    Specifying multiple Repository's Location

    To specify multiple Repository's Location in a single row, we can use a semicolon ; as a separator.

    Below is an example:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/reposense/RepoSense.git;https://github.com/MarkBind/markbind.git master sikai00 --

    We have now furnished author details for both repositories in a single row, instead of having two individual rows per Repository's Location.


    Specifying Repository's Location with one or more specific branches

    To list out one or more branches for a particular Repository's Location, we can use a pipe | separator to demarcate the different branches.

    Below is an example:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/reposense/RepoSense.git~master|release|cypress master sikai00 --

    We have now provided author details for three different branches in a single repo, using a single row.

    The branch specified through the delimiter syntax will take precedence over the Branch column.

    Using GitHub branch URL as Repository's Location

    We can also use GitHub branch URL as copied from the address bar directly, to be able to quickly use the URL to specify the Repository's Location and a specific Branch at the same time.

    Below is an example:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/reposense/RepoSense/tree/release sikai00 --

    There is no need to specify the Branch column now, as we have specified it through the GitHub branch URL.

    GitLab and BitBucket branch URL are not supported at the moment.

    Combining the advanced syntax

    It is possible to combine the above-mentioned advanced syntax. By doing so, we can go from:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/MarkBind/markbind/tree/vue3-migration sikai00 --
    https://github.com/reposense/RepoSense.git master sikai00 --
    https://github.com/reposense/RepoSense.git cypress sikai00 --

    to:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/MarkBind/markbind/tree/vue3-migration;https://github.com/reposense/RepoSense.git~master|cypress sikai00 --

    +

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: author-config.csv advanced syntax

    Given below are the advanced syntax available for author-config.csv.

    Multiple Repository's Location per author

    Specifying multiple Repository's Location

    To specify multiple Repository's Location in a single row, we can use a semicolon ; as a separator.

    Below is an example:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/reposense/RepoSense.git;https://github.com/MarkBind/markbind.git master sikai00 --

    We have now furnished author details for both repositories in a single row, instead of having two individual rows per Repository's Location.


    Specifying Repository's Location with one or more specific branches

    To list out one or more branches for a particular Repository's Location, we can use a pipe | separator to demarcate the different branches.

    Below is an example:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/reposense/RepoSense.git~master|release|cypress master sikai00 --

    We have now provided author details for three different branches in a single repo, using a single row.

    The branch specified through the delimiter syntax will take precedence over the Branch column.

    Using GitHub branch URL as Repository's Location

    We can also use GitHub branch URL as copied from the address bar directly, to be able to quickly use the URL to specify the Repository's Location and a specific Branch at the same time.

    Below is an example:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/reposense/RepoSense/tree/release sikai00 --

    There is no need to specify the Branch column now, as we have specified it through the GitHub branch URL.

    GitLab and BitBucket branch URL are not supported at the moment.

    Combining the advanced syntax

    It is possible to combine the above-mentioned advanced syntax. By doing so, we can go from:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/MarkBind/markbind/tree/vue3-migration sikai00 --
    https://github.com/reposense/RepoSense.git master sikai00 --
    https://github.com/reposense/RepoSense.git cypress sikai00 --

    to:

    Repository's Location Branch Author's Git Host ID ... Hidden columns
    https://github.com/MarkBind/markbind/tree/vue3-migration;https://github.com/reposense/RepoSense.git~master|cypress sikai00 --

    diff --git a/ug/authorConfigSyntax.page-vue-render.js b/ug/authorConfigSyntax.page-vue-render.js index ca982d4bfe..e82f2f1727 100644 --- a/ug/authorConfigSyntax.page-vue-render.js +++ b/ug/authorConfigSyntax.page-vue-render.js @@ -59,6 +59,6 @@ with(this){return _c('div',{staticClass:"table-responsive"},[_c('table',{staticC with(this){return _c('div',{staticClass:"table-responsive"},[_c('table',{staticClass:"markbind-table table table-bordered table-striped"},[_c('thead',[_c('tr',[_c('th',[_v("Repository's Location")]),_v(" "),_c('th',[_v("Branch")]),_v(" "),_c('th',[_v("Author's Git Host ID")]),_v(" "),_c('th',[_v("... Hidden columns")])])]),_v(" "),_c('tbody',[_c('tr',[_c('td',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("https://github.com/MarkBind/markbind/tree/vue3-migration;https://github.com/reposense/RepoSense.git~master|cypress")])]),_v(" "),_c('td'),_v(" "),_c('td',[_v("sikai00")]),_v(" "),_c('td',[_v("--")])])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/blurbs.html b/ug/blurbs.html index 41a8fbc095..751c559963 100644 --- a/ug/blurbs.html +++ b/ug/blurbs.html @@ -18,7 +18,7 @@ Cypress branch of RepoSense

    ------------------------------------

    https://github.com/reposense/publish-RepoSense/tree/master -Publishing branch of RepoSense

    +Publishing branch of RepoSense

    diff --git a/ug/blurbs.page-vue-render.js b/ug/blurbs.page-vue-render.js index 92ac2fd23f..737a3d6f94 100644 --- a/ug/blurbs.page-vue-render.js +++ b/ug/blurbs.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('div',{staticClass:"text-center bg-warning p-2",attrs:{"tag with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('p',[_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/tree/cypress"}},[_v("https://github.com/reposense/RepoSense/tree/cypress")]),_v("\nCypress branch of RepoSense")]),_v("\n------------------------------------\n"),_c('p',[_c('a',{attrs:{"href":"https://github.com/reposense/publish-RepoSense/tree/master"}},[_v("https://github.com/reposense/publish-RepoSense/tree/master")]),_v("\nPublishing branch of RepoSense")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/cli.html b/ug/cli.html index 6b865dd762..3790e8b42f 100644 --- a/ug/cli.html +++ b/ug/cli.html @@ -30,7 +30,7 @@ Default: one month before the current date
  • Alias: -s
  • Example:--since 21/10/2017 or -s 21/10/2017
    • If the start date is not specified, only commits made one month before the end date (if specified) or the date of generating the report, will be captured and analyzed.
    • If d1 is specified as the start date (--since d1 or -s d1), then the program will search for the earliest commit date of all repositories and use that as the start date.
    • If d1 is specified together with --period, then the program will warn that the date range being analyzed may be incorrect.

    --timezone, -t

    --timezone ZONE_ID: Indicates the timezone to be used for the analysis.

    --until, -u

    --until END_DATE: Specifies the end date of the analysis period.

    Note: If the end date is not specified, the date of generating the report will be taken as the end date.

    --version, -V

    --version: Shows the version of RepoSense.

    Cannot be used with any other flags. This flag takes precedence over all other flags other than --help.

    --view, -v

    --view [REPORT_FOLDER]: Specifies that the report should be opened in the default browser.

    +Default: ./reposense-report
  • Alias: -v
  • Example:--view or -v
  • diff --git a/ug/cli.page-vue-render.js b/ug/cli.page-vue-render.js index 8784c0cf26..76e8dc23da 100644 --- a/ug/cli.page-vue-render.js +++ b/ug/cli.page-vue-render.js @@ -185,6 +185,6 @@ with(this){return _c('p',[_c('strong',[_c('code',{pre:true,attrs:{"class":"hljs with(this){return _c('ul',[_c('li',[_v("Parameter: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("REPORT_FOLDER")]),_v(" Optional. If specified, no analysis will be performed and the report specified by the argument will be opened."),_c('br'),_v("\nDefault: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("./reposense-report")])]),_v(" "),_c('li',[_v("Alias: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("-v")])]),_v(" "),_c('li',[_v("Example:"),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--view")]),_v(" or "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("-v")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/configFiles.html b/ug/configFiles.html index 04f15b095a..a1885d90ce 100644 --- a/ug/configFiles.html +++ b/ug/configFiles.html @@ -57,7 +57,7 @@ To find the author name that you are currently using for your current Git repository, run the following command within your Git repository:

    git config user.name
     

    To set the author name to the value you want (e.g., to set it to your GitHub username) for your current Git repository, you can use the following command (more info):

    git config user.name "YOUR_AUTHOR_NAME”
     

    To set the author name to use a default value you want for future Git repositories, you can use the following command:

    git config --global user.name "YOUR_AUTHOR_NAME”
    -

    RepoSense expects the Git Author Name to be the same as author's username on the Git hosting platform (GitHub, GitLab, BitBucket). If an author's Git Author Name is different from their username on the Git hosting platform, the Git Author Name needs to be specified in the standalone config file. If the author has more than one Git Author Name, multiple values can be entered too.

    Note: Symbols such as ", !, / etc. in your author name will be omitted, which may reduce the accuracy of the analysis if 2 names in the repository are approximately similar.

    blurbs.md

    You can optionally use blurbs.md to add blurbs in Markdown syntax for repository branches. These blurbs will be seen when grouping by Repo/Branch. (example)

    Format:

    +

    RepoSense expects the Git Author Name to be the same as author's username on the Git hosting platform (GitHub, GitLab, BitBucket). If an author's Git Author Name is different from their username on the Git hosting platform, the Git Author Name needs to be specified in the standalone config file. If the author has more than one Git Author Name, multiple values can be entered too.

    Note: Symbols such as ", !, / etc. in your author name will be omitted, which may reduce the accuracy of the analysis if 2 names in the repository are approximately similar.

    blurbs.md

    You can optionally use blurbs.md to add blurbs in Markdown syntax for repository branches. These blurbs will be seen when grouping by Repo/Branch. (example)

    Format:

    diff --git a/ug/configFiles.page-vue-render.js b/ug/configFiles.page-vue-render.js index fec6fd1de4..84b23d4472 100644 --- a/ug/configFiles.page-vue-render.js +++ b/ug/configFiles.page-vue-render.js @@ -134,6 +134,6 @@ with(this){return _c('p',[_v("RepoSense expects the Git Author Name to be the sa with(this){return _c('div',{attrs:{"id":"section-blurbs"}},[_c('h2',{attrs:{"id":"blurbs-md"}},[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("blurbs.md")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#blurbs-md","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("You can optionally use "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("blurbs.md")]),_v(" to add blurbs in Markdown syntax for repository branches. These blurbs will be seen when grouping by "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Repo/Branch")]),_v(". ("),_c('a',{attrs:{"href":"https://github.com/reposense/RepoSense/blob/master/docs/ug/blurbs.md"}},[_v("example")]),_v(")")]),_v(" "),_c('p',[_c('strong',[_v("Format")]),_v(":")]),_v(" "),_c('ul',[_c('li',[_v("First line in section: Link to the repository branch.")]),_v(" "),_c('li',[_v("Second line onwards: Blurb content.")]),_v(" "),_c('li',[_v("Delimiter: "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("")]),_v(". Everything on the line after the delimiter will be ignored.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/customizingReports.html b/ug/customizingReports.html index 9e5edfbde0..327ee1a15f 100644 --- a/ug/customizingReports.html +++ b/ug/customizingReports.html @@ -15,7 +15,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Customizing reports

    The report can be customized using several ways, as explained below.

    Customize using CLI flags

    The simplest approach is to provide additional flags when running RepoSense. The various flags are given in the panel below.

    Customize using CSV config files

    Another, more powerful, way to customize the report is by using dedicated config files. In this case you need to use the --config flag instead of the --repo flag when running RepoSense, as follows:

    Managing config files collaboratively: If you use RepoSense to monitor a large number of programmers, it may be more practical to get the programmers to submit PRs to update the config files as necessary ().

    To ensure that their PRs are correct, you can use Netlify deploy previews to preview how the report would look like after the PR has been merged. More details are in the panels below.

    Get target repos to provide more info

    If feasible, you can also customize the target repos to play well with RepoSense in the following two ways:

    1. Add a standalone config file to the repo to provide more config details to RepoSense. The format of the file is given below.

    2. To have more precise control over which code segment is attributed to which author, authors can annotate their code using @@author tags, as explained below.

    In both instances, it is necessary to commit any changes for them to be detected by RepoSense.

    3. Add a Git .mailmap file at the top-level of the repository, specifying mapped authors/commiters and/or e-mail addresses as per gitmailmap documentation. Any mappings specified here will be applied by Git before all other RepoSense configurations. Configuration via .mailmap is particularly useful if you want the mapping to apply for all Git commands as well instead of just for RepoSense.

    Personalizing Reports

    Add a title

    A title component can be added by creating a file titled title.md in the assets directory. You can specify the assets directory according to the reference below:

    The title can render a combination of Markdown/HTML and plaintext (example), and will appear on the top of the left panel as shown below: -Title Component Example

    Do note that the width of the title is bound by the width of the left panel.

    For more information on how to use Markdown, see the Markdown Guide.

    Add blurbs for branches

    A blurb can be added for a repository branch by creating a file titled blurbs.md in the config directory. The blurbs will be visible when grouping by Repo/Branch. The format of the file is given below:

    Specifying the config directory can be done as follows:

    +Title Component Example

    Do note that the width of the title is bound by the width of the left panel.

    For more information on how to use Markdown, see the Markdown Guide.

    Add blurbs for branches

    A blurb can be added for a repository branch by creating a file titled blurbs.md in the config directory. The blurbs will be visible when grouping by Repo/Branch. The format of the file is given below:

    Specifying the config directory can be done as follows:

    diff --git a/ug/customizingReports.page-vue-render.js b/ug/customizingReports.page-vue-render.js index d3b807fe1b..2cd4d64864 100644 --- a/ug/customizingReports.page-vue-render.js +++ b/ug/customizingReports.page-vue-render.js @@ -62,6 +62,6 @@ with(this){return _c('h4',{attrs:{"id":"add-blurbs-for-branches"}},[_v("Add blur with(this){return _c('p',[_v("A blurb can be added for a repository branch by creating a file titled "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("blurbs.md")]),_v(" in the config directory. The blurbs will be visible when grouping by "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Repo/Branch")]),_v(". The format of the file is given below:")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/faq.html b/ug/faq.html index f2c4bea1e8..144e6cec78 100644 --- a/ug/faq.html +++ b/ug/faq.html @@ -17,7 +17,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: FAQ

    Q: Does RepoSense work on private repositories?

    A: RepoSense will first clone the Git repository to be analyzed; thus, if you do not have access to the repository, we cannot run the analysis.
    To enable RepoSense to work on private repositories, ensure that you have enabled access to your private repository in your Git terminal first before running the analysis.

    Q: How do formats work?

    A: Formats are the file extensions, which is the suffix at the end of a filename that indicates what type of file it is.
    The formats/file extensions to be analyzed by RepoSense can be specified through the standalone config file, repo-config file, and command line.

    Q: How does ignore glob list work?

    A: Glob is the pattern to specify a set of filenames with wildcard characters. Ignore glob list is the list of patterns to specify all the files in the repository which should be ignored from analysis.
    -The ignore glob list can be specified through the standalone config file, repo-config file, and author-config file.

    +The ignore glob list can be specified through the standalone config file, repo-config file, and author-config file.

    diff --git a/ug/faq.page-vue-render.js b/ug/faq.page-vue-render.js index 1abf450c46..d5bd09b944 100644 --- a/ug/faq.page-vue-render.js +++ b/ug/faq.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('div',{staticClass:"text-center bg-warning p-2",attrs:{"tag with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-4",attrs:{"id":"appendix-faq"}},[_c('span',[_v("Appendix: FAQ")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#appendix-faq","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"q-does-reposense-work-on-private-repositories"}},[_v("Q: Does RepoSense work on private repositories?"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#q-does-reposense-work-on-private-repositories","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" "),_c('em',[_v("RepoSense")]),_v(" will first clone the Git repository to be analyzed; thus, if you do not have access to the repository, we cannot run the analysis."),_c('br'),_v("\nTo enable "),_c('em',[_v("RepoSense")]),_v(" to work on private repositories, ensure that you have enabled access to your private repository in your Git terminal first before running the analysis.")]),_v(" "),_c('h3',{attrs:{"id":"q-how-do-formats-work"}},[_v("Q: How do formats work?"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#q-how-do-formats-work","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" "),_c('strong',[_v("Formats")]),_v(" are the "),_c('a',{attrs:{"href":"https://techterms.com/definition/fileextension"}},[_v("file extensions")]),_v(", which is the "),_c('strong',[_v("suffix")]),_v(" at the end of a filename that indicates what type of file it is."),_c('br'),_v("\nThe formats/file extensions to be analyzed by "),_c('em',[_v("RepoSense")]),_v(" can be specified through the "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#config-json-standalone-config-file"}},[_v("standalone config file")]),_v(", "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#repo-config-csv"}},[_v("repo-config file")]),_v(", and "),_c('a',{attrs:{"href":"/RepoSense/ug/cli.html#formats-f"}},[_v("command line")]),_v(".")]),_v(" "),_c('h3',{attrs:{"id":"q-how-does-ignore-glob-list-work"}},[_v("Q: How does ignore glob list work?"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#q-how-does-ignore-glob-list-work","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("A:")]),_v(" "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Glob_(programming)"}},[_v("Glob")]),_v(" is the pattern to specify a set of filenames with "),_c('a',{attrs:{"href":"https://www.computerhope.com/jargon/w/wildcard.htm"}},[_v("wildcard characters")]),_v(". "),_c('strong',[_v("Ignore glob list")]),_v(" is the list of patterns to specify all the files in the repository which should be ignored from analysis."),_c('br'),_v("\nThe ignore glob list can be specified through the "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#config-json-standalone-config-file"}},[_v("standalone config file")]),_v(", "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#repo-config-csv"}},[_v("repo-config file")]),_v(", and "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#author-config-csv"}},[_v("author-config file")]),_v(".")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/generatingReports.html b/ug/generatingReports.html index 4ce2b64104..8ec2c874d7 100644 --- a/ug/generatingReports.html +++ b/ug/generatingReports.html @@ -17,7 +17,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Generating a report

    Let's look at different ways to generate RepoSense reports.

    RepoSense is built to analyze any type of Git repo, remote or local. It works best when analyzing remote repositories hosted on GitHub, GitLab or BitBucket. For other types of repositories, external links are disabled.

    Generating reports locally

    1. Ensure you have the prerequisites:

      • Java 11 or later (download ).
      • Git 2.23 or later on the command line. (download ).
        run git --version in your OS terminal to confirm the version.
    2. Download the latest JAR file from our releases.

    3. Generate a report: The simplest use case for RepoSense is to generate a report for the recent history of a repo.
      command: java -jar RepoSense.jar --repos LIST_OF_REPO_URLS --view
      -Examples:

      • java -jar RepoSense.jar --repos https://github.com/reposense/RepoSense.git --view (note the .git at the end of the repo URL)
      • java -jar RepoSense.jar --repos https://github.com/reposense/RepoSense.git c:/myRepose/foo/bar --view analyzes the two specified repos (one remote, one local).

      The above commands will analyze the given repo(s) for commits done within the last month and open the report in your default Browser.

    To learn how to generate a report using , head over to the Customizing reports section.

    Generating reports remotely

    You can generate a RepoSense report remotely without installing/running anything on your computer. This is particularly useful when you are deciding whether to adopt RepoSense.

    The easiest option is to use Netlify. The instructions are given below.

    You can also use the following options. While they are more work to set up, they are more suitable as a permanent solution due to their generous free tier.

    +Examples:

    The above commands will analyze the given repo(s) for commits done within the last month and open the report in your default Browser.

    To learn how to generate a report using , head over to the Customizing reports section.

    Generating reports remotely

    You can generate a RepoSense report remotely without installing/running anything on your computer. This is particularly useful when you are deciding whether to adopt RepoSense.

    The easiest option is to use Netlify. The instructions are given below.

    You can also use the following options. While they are more work to set up, they are more suitable as a permanent solution due to their generous free tier.

    diff --git a/ug/generatingReports.page-vue-render.js b/ug/generatingReports.page-vue-render.js index 9d5ae5f5f3..3cf5e21d07 100644 --- a/ug/generatingReports.page-vue-render.js +++ b/ug/generatingReports.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_c('strong',[_v("The easiest option is to use Netlify. with(this){return _c('p',[_c('strong',[_v("You can also use the following options.")]),_v(" While they are more work to set up, they are more suitable as a permanent solution due to their generous free tier.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/grantingWriteAccess.html b/ug/grantingWriteAccess.html index 7f5d2f8666..4a769fbe73 100644 --- a/ug/grantingWriteAccess.html +++ b/ug/grantingWriteAccess.html @@ -17,7 +17,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Granting write-access to a repository

    We recommend using a personal access token if aiming for the ease of setup and deploy key if aiming for enhanced security.

    If you wish to use personal access token:

    1. Create a personal access token by following this guide and give only public_repo permission.
    2. Copy the token for later use.

    If you wish to use deploy key:

    [Windows users] ssh-keygen and base64 are accessible using Git Bash.

    1. Create a public-private key pair (without a passphrase) using the ssh-keygen.
      i.e., ssh-keygen -t ecdsa -b 521 -f id_reposense -q -N ""
    2. Create a deploy key as follows:
      1. Go to the settings page of your publish-RepoSense fork
      2. Click on the Deploy keys item in the navigation menu in that page
      3. Click on the Add deploy key button and create a new deploy key with the contents of id_reposense.pub.
    3. Copy the private key in base64 encoded format for later use.
      -i.e., cat id_reposense | base64 -w 0
    +i.e., cat id_reposense | base64 -w 0 diff --git a/ug/grantingWriteAccess.page-vue-render.js b/ug/grantingWriteAccess.page-vue-render.js index aa4b617335..95cc41df2a 100644 --- a/ug/grantingWriteAccess.page-vue-render.js +++ b/ug/grantingWriteAccess.page-vue-render.js @@ -26,6 +26,6 @@ with(this){return _c('h3',{attrs:{"id":"if-you-wish-to-use-deploy-key"}},[_v("If with(this){return _c('ol',[_c('li',[_c('strong',[_v("Create a public-private key pair")]),_v(" (without a passphrase) using the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ssh-keygen")]),_v(". "),_c('br'),_v("\ni.e., "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("ssh-keygen -t ecdsa -b 521 -f id_reposense -q -N \"\"")])]),_v(" "),_c('li',[_c('strong',[_v("Create a deploy key")]),_v(" as follows:\n"),_c('ol',[_c('li',[_v("Go to the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("settings")]),_v(" page of your publish-RepoSense fork")]),_v(" "),_c('li',[_v("Click on the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Deploy keys")]),_v(" item in the navigation menu in that page")]),_v(" "),_c('li',[_v("Click on the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Add deploy key")]),_v(" button and create a new deploy key with the contents of "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("id_reposense.pub")]),_v(".")])])]),_v(" "),_c('li',[_c('strong',[_v("Copy the private key")]),_v(" in base64 encoded format for later use. "),_c('br'),_v("\ni.e., "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("cat id_reposense | base64 -w 0")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/index.html b/ug/index.html index 422ac82c35..9c6d1b7ddf 100644 --- a/ug/index.html +++ b/ug/index.html @@ -14,7 +14,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    User guide

    Welcome to the RepoSense user guide. This user guide takes you through a three-step approach to adopting RepoSense for your own use.


    In case you missed it, the overview of RepoSense is given below.

    Report: We use the term report to refer to the web-based visualization generated by RepoSense. You can also think of it as a dashboard.

    1 Explore real-life examples

    If still not entirely sure if RepoSense matches your needs, you can use the examples of real-life RepoSense reports given below to get some sense of what visualizations it produces.

    As you explore the above examples, you can refer to the following section to learn how to read and interact with those reports.

    2 Generate your own reports

    The next step is to generate your own RepoSense reports, either in your computer, or on one of the remote platforms we support.

    As you generate reports, you may need to learn how to customize those reports further.

    3 Share your reports

    Finally, you can learn how to share those reports with others, and how to automate the whole process.

    If you encounter problems at any step, you can refer to our FAQ, the troubleshooting guide, or post in our issue tracker.



    Happy RepoSensing!

    +

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    User guide

    Welcome to the RepoSense user guide. This user guide takes you through a three-step approach to adopting RepoSense for your own use.


    In case you missed it, the overview of RepoSense is given below.

    Report: We use the term report to refer to the web-based visualization generated by RepoSense. You can also think of it as a dashboard.

    1 Explore real-life examples

    If still not entirely sure if RepoSense matches your needs, you can use the examples of real-life RepoSense reports given below to get some sense of what visualizations it produces.

    As you explore the above examples, you can refer to the following section to learn how to read and interact with those reports.

    2 Generate your own reports

    The next step is to generate your own RepoSense reports, either in your computer, or on one of the remote platforms we support.

    As you generate reports, you may need to learn how to customize those reports further.

    3 Share your reports

    Finally, you can learn how to share those reports with others, and how to automate the whole process.

    If you encounter problems at any step, you can refer to our FAQ, the troubleshooting guide, or post in our issue tracker.



    Happy RepoSensing!

    diff --git a/ug/index.page-vue-render.js b/ug/index.page-vue-render.js index c763e73440..cc16ec0bdb 100644 --- a/ug/index.page-vue-render.js +++ b/ug/index.page-vue-render.js @@ -14,6 +14,6 @@ with(this){return _c('h1',{staticClass:"display-3",attrs:{"id":"user-guide"}},[_ with(this){return _c('div',{staticClass:"lead"},[_c('p',[_v("Welcome to the RepoSense user guide. This user guide takes you through a three-step approach to adopting RepoSense for your own use.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/runSh.html b/ug/runSh.html index c02cb6f934..fc7e3415b2 100644 --- a/ug/runSh.html +++ b/ug/runSh.html @@ -14,7 +14,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: run.sh format

    run.sh is a script used for automating RepoSense report generation.

    Customizing the RepoSense command

    You can update the RepoSense command (i.e., the last line) in the run.sh to match your needs.

    Specifying which version of RepoSense to use

    Depending on which version you wish to use for report generation, add one of the following flags to the line ./get-reposense.py in run.sh (e.g., ./get-reposense.py --release):

    • --release: Use the latest release (Stable)
    • --master: Use the latest version of the master branch
    • --tag TAG (e.g. --tag v1.6.1): Use the version identified by the Git tag given
    • --commit COMMIT (e.g. --commit abc123): Use the version identified by the Git commit SHA given
    +

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: run.sh format

    run.sh is a script used for automating RepoSense report generation.

    Customizing the RepoSense command

    You can update the RepoSense command (i.e., the last line) in the run.sh to match your needs.

    Specifying which version of RepoSense to use

    Depending on which version you wish to use for report generation, add one of the following flags to the line ./get-reposense.py in run.sh (e.g., ./get-reposense.py --release):

    diff --git a/ug/runSh.page-vue-render.js b/ug/runSh.page-vue-render.js index 530ab414c6..f137547ecb 100644 --- a/ug/runSh.page-vue-render.js +++ b/ug/runSh.page-vue-render.js @@ -29,6 +29,6 @@ with(this){return _c('p',[_v("Depending on which version you wish to use for rep with(this){return _c('ul',[_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--release")]),_v(": Use the latest release (Stable)")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--master")]),_v(": Use the latest version of the master branch")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--tag TAG")]),_v(" (e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--tag v1.6.1")]),_v("): Use the version identified by the Git tag given")]),_v(" "),_c('li',[_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--commit COMMIT")]),_v(" (e.g. "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("--commit abc123")]),_v("): Use the version identified by the Git commit SHA given")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/sharingReports.html b/ug/sharingReports.html index 1062a83ddb..8bd830918d 100644 --- a/ug/sharingReports.html +++ b/ug/sharingReports.html @@ -15,7 +15,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Sharing reports

    Often, you would want to share the RepoSense report with others. For example, a teacher using RepoSense for a programming class might want to share the report privately with tutors or publish it so that everyone can see it.

    The sections below explain various ways of sharing a RepoSense report.

    Share privately

    To share a RepoSense report privately, simply find a way to share the folder containing the report (by default, it will be in a folder named reposense-report). For example, you can zip that folder and share it with the intended recipients.

    You can point the recipients to the Using reports section for guidance on how to view reports.

    Publish on the web

    As RepoSense reports are in a web page format, you can publish a report by simply uploading it onto any web hosting service. Given below are several options that not only allow to publish reports, but also enable various levels of automating the entire process (e.g., automatically update the report daily).

    Embeddable Widgets

    Published reports can additionally be embedded in other websites through iframes. Simply click the clipboard icon to generate and copy the iframe for your desired section of the report for either a single ramp chart or a group of ramp charts. Paste the iframe in any HTML supported document to render it.

    A sample iframe would look like:

    <iframe src="XXX" frameborder="0" width="800px" height="XXXpx"></iframe>
    -

    Adjust the width and height to the desired dimensions as required.

    +

    Adjust the width and height to the desired dimensions as required.

    diff --git a/ug/sharingReports.page-vue-render.js b/ug/sharingReports.page-vue-render.js index 49ee3cc030..f894712a90 100644 --- a/ug/sharingReports.page-vue-render.js +++ b/ug/sharingReports.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_v("Published reports can additionally be embedded in with(this){return _c('pre',[_c('code',{pre:true,attrs:{"class":"hljs html"}},[_c('span',[_c('span',{pre:true,attrs:{"class":"hljs-tag"}},[_v("<"),_c('span',{pre:true,attrs:{"class":"hljs-name"}},[_v("iframe")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("src")]),_v("="),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"XXX\"")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("frameborder")]),_v("="),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"0\"")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("width")]),_v("="),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"800px\"")]),_v(" "),_c('span',{pre:true,attrs:{"class":"hljs-attr"}},[_v("height")]),_v("="),_c('span',{pre:true,attrs:{"class":"hljs-string"}},[_v("\"XXXpx\"")]),_v(">")]),_c('span',{pre:true,attrs:{"class":"hljs-tag"}},[_v("")]),_v("\n")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/title.html b/ug/title.html index ffed8769b6..ac54879a39 100644 --- a/ug/title.html +++ b/ug/title.html @@ -14,7 +14,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    RepoSense

    RepoSense is a powerful tool for analyzing repositories. It provides valuable insights into your codebase, helping you understand the development patterns, identify areas for improvement, and track the contributions of individual team members.

    Features

    • Repository analysis: Gain a comprehensive overview of your codebase, including commit statistics, file changes, and code ownership.
    • Contribution tracking: Easily track the contributions made by each team member, including the number of commits, lines of code added/removed, and more.
    • Visualization: Visualize your repository's history and changes over time through interactive graphs and charts.
    +

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    RepoSense

    RepoSense is a powerful tool for analyzing repositories. It provides valuable insights into your codebase, helping you understand the development patterns, identify areas for improvement, and track the contributions of individual team members.

    Features

    diff --git a/ug/title.page-vue-render.js b/ug/title.page-vue-render.js index aa7973f88b..02096ea8d5 100644 --- a/ug/title.page-vue-render.js +++ b/ug/title.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('div',{staticClass:"text-center bg-warning p-2",attrs:{"tag with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{attrs:{"id":"reposense"}},[_v("RepoSense"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#reposense","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("RepoSense is a powerful tool for analyzing repositories. It provides valuable insights into your codebase, helping you understand the development patterns, identify areas for improvement, and track the contributions of individual team members.")]),_v(" "),_c('h2',{attrs:{"id":"features"}},[_v("Features"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#features","onclick":"event.stopPropagation()"}})]),_v(" "),_c('ul',[_c('li',[_v("Repository analysis: Gain a comprehensive overview of your codebase, including commit statistics, file changes, and code ownership.")]),_v(" "),_c('li',[_v("Contribution tracking: Easily track the contributions made by each team member, including the number of commits, lines of code added/removed, and more.")]),_v(" "),_c('li',[_v("Visualization: Visualize your repository's history and changes over time through interactive graphs and charts.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/troubleshooting.html b/ug/troubleshooting.html index 46fd9549c8..b2d20f775a 100644 --- a/ug/troubleshooting.html +++ b/ug/troubleshooting.html @@ -18,7 +18,7 @@ Please refer to A Note About Git Author Name above on how to find out the correct author name you are using and how to change it.
    Also, ensure that you have added all author name aliases you may be using (if you are using multiple computers or have previously changed your author name).
    Alternatively, you may choose to configure RepoSense to track the email associated with your local Git config or remote Git host email in a standalone config file or author-config file, which is more accurate compared to author name aliases. For GitHub, the associated email you are using can be found in your GitHub settings.

    Contribution bar and code panel is empty (despite a non-empty ramp chart)

    The contribution bar and code panel records the lines you have authored to the latest commit of the repository and branch you are analyzing. As such, it is possible that while you have lots of committed contributions, your final authorship contribution is low. This happens if you have only deleted lines or someone else has overwritten your code and taken authorship for it (currently, RepoSense does not have the functionality to track overwritten lines).
    -It is also possible that another user has overridden the authorship of your lines using the @@author tags.

    RepoSense is not using the standalone config file in my local repository

    Ensure that you have committed the changes to your standalone config file first before running the analysis, as RepoSense is unable to detect uncommitted changes to your local repository.

    RepoSense fails on Windows (but works on Linux/Mac OS)

    Possibly, you may have some file names with special characters in them, which is disallowed in Windows OS. As such, RepoSense is unable to clone your repository fully, thus failing the analysis.

    Some file types are not shown in the file type filter even if I have included them in the file formats when generating the report

    The files of these types may be binary files. RepoSense will group binary files under one single file type binary. Common binary files include images (.jpg, .png), applications (.exe), zip files (.zip, .rar) and certain document types (.docx, .pptx).

    +It is also possible that another user has overridden the authorship of your lines using the @@author tags.

    RepoSense is not using the standalone config file in my local repository

    Ensure that you have committed the changes to your standalone config file first before running the analysis, as RepoSense is unable to detect uncommitted changes to your local repository.

    RepoSense fails on Windows (but works on Linux/Mac OS)

    Possibly, you may have some file names with special characters in them, which is disallowed in Windows OS. As such, RepoSense is unable to clone your repository fully, thus failing the analysis.

    Some file types are not shown in the file type filter even if I have included them in the file formats when generating the report

    The files of these types may be binary files. RepoSense will group binary files under one single file type binary. Common binary files include images (.jpg, .png), applications (.exe), zip files (.zip, .rar) and certain document types (.docx, .pptx).

    diff --git a/ug/troubleshooting.page-vue-render.js b/ug/troubleshooting.page-vue-render.js index b4b85d7486..4b85fd4987 100644 --- a/ug/troubleshooting.page-vue-render.js +++ b/ug/troubleshooting.page-vue-render.js @@ -11,6 +11,6 @@ with(this){return _c('div',{staticClass:"text-center bg-warning p-2",attrs:{"tag with(this){return _c('div',{staticClass:"fixed-header-padding",attrs:{"id":"content-wrapper"}},[_c('h1',{staticClass:"display-4",attrs:{"id":"appendix-troubleshooting"}},[_c('span',[_v("Appendix: Troubleshooting")]),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#appendix-troubleshooting","onclick":"event.stopPropagation()"}})]),_v(" "),_c('h3',{attrs:{"id":"contributions-missing-in-the-ramp-chart-but-appear-in-the-contribution-bar-and-code-panel"}},[_v("Contributions missing in the ramp chart (but appear in the contribution bar and code panel)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#contributions-missing-in-the-ramp-chart-but-appear-in-the-contribution-bar-and-code-panel","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("This is probably a case of giving an incorrect author name alias (or Git ID) in your "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#author-config-csv"}},[_v("author-config file")]),_v("."),_c('br'),_v("\nPlease refer to "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#a-note-about-git-author-name"}},[_v("A Note About Git Author Name")]),_v(" above on how to find out the correct author name you are using and how to change it."),_c('br'),_v("\nAlso, ensure that you have added all author name aliases you may be using (if you are using multiple computers or have previously changed your author name)."),_c('br'),_v("\nAlternatively, you may choose to configure "),_c('em',[_v("RepoSense")]),_v(" to track the email associated with your local Git config or remote Git host email in a "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#config-json-standalone-config-file"}},[_v("standalone config file")]),_v(" or "),_c('a',{attrs:{"href":"/RepoSense/ug/configFiles.html#author-config-csv"}},[_v("author-config file")]),_v(", which is more accurate compared to author name aliases. For GitHub, the associated email you are using can be found in your "),_c('a',{attrs:{"href":"https://github.com/settings/emails"}},[_v("GitHub settings")]),_v(".")]),_v(" "),_c('h3',{attrs:{"id":"contribution-bar-and-code-panel-is-empty-despite-a-non-empty-ramp-chart"}},[_v("Contribution bar and code panel is empty (despite a non-empty ramp chart)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#contribution-bar-and-code-panel-is-empty-despite-a-non-empty-ramp-chart","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("The contribution bar and code panel records the lines you have authored to the "),_c('strong',[_v("latest")]),_v(" commit of the repository and branch you are analyzing. As such, it is possible that while you have lots of committed contributions, your final authorship contribution is low. This happens if you have only deleted lines or someone else has overwritten your code and taken authorship for it (currently, RepoSense does not have the functionality to track overwritten lines)."),_c('br'),_v("\nIt is also possible that another user has overridden the authorship of your lines using the "),_c('a',{attrs:{"href":"/RepoSense/ug/usingAuthorTags.html#appendix-using-author-tags"}},[_v("@@author tags")]),_v(".")]),_v(" "),_c('h3',{attrs:{"id":"reposense-is-not-using-the-standalone-config-file-in-my-local-repository"}},[_v("RepoSense is not using the standalone config file in my local repository"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#reposense-is-not-using-the-standalone-config-file-in-my-local-repository","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Ensure that you have committed the changes to your standalone config file first before running the analysis, as "),_c('em',[_v("RepoSense")]),_v(" is unable to detect uncommitted changes to your local repository.")]),_v(" "),_c('h3',{attrs:{"id":"reposense-fails-on-windows-but-works-on-linux-mac-os"}},[_v("RepoSense fails on Windows (but works on Linux/Mac OS)"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#reposense-fails-on-windows-but-works-on-linux-mac-os","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("Possibly, you may have some file names with "),_c('a',{attrs:{"href":"https://docs.microsoft.com/en-us/windows/desktop/FileIO/naming-a-file#naming-conventions"}},[_v("special characters")]),_v(" in them, which is disallowed in Windows OS. As such, "),_c('em',[_v("RepoSense")]),_v(" is unable to clone your repository fully, thus failing the analysis.")]),_v(" "),_c('h3',{attrs:{"id":"some-file-types-are-not-shown-in-the-file-type-filter-even-if-i-have-included-them-in-the-file-formats-when-generating-the-report"}},[_v("Some file types are not shown in the file type filter even if I have included them in the file formats when generating the report"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#some-file-types-are-not-shown-in-the-file-type-filter-even-if-i-have-included-them-in-the-file-formats-when-generating-the-report","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_v("The files of these types may be "),_c('a',{attrs:{"href":"https://en.wikipedia.org/wiki/Binary_file"}},[_v("binary files")]),_v(". "),_c('em',[_v("RepoSense")]),_v(" will group binary files under one single file type "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("binary")]),_v(". Common binary files include images ("),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".jpg")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".png")]),_v("), applications ("),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".exe")]),_v("), zip files ("),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".zip")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".rar")]),_v(") and certain document types ("),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".docx")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".pptx")]),_v(").")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/usingAuthorTags.html b/ug/usingAuthorTags.html index a5f5a8672a..6389a68dbd 100644 --- a/ug/usingAuthorTags.html +++ b/ug/usingAuthorTags.html @@ -15,7 +15,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: Using @@author tags

    @@author tags is a rather invasive but sometimes necessary way to provide more information to RepoSense, by annotating the code being analyzed.

    If you want to override the code authorship deduced by RepoSense (which is based on Git blame/log data), you can use @@author tags to specify certain code segments that should be credited to a certain author irrespective of Git history. An example scenario where this is useful is when a method was originally written by one author but a second author did some minor refactoring to it; in this case, RepoSense might attribute the code to the second author while you may want to attribute the code to the first author.

    There are 2 types of @@author tags:

    • Start Tags (format: @@author AUTHOR_GIT_AUTHOR_NAME): A start tag indicates the start of a code segment written by the author identified by the AUTHOR_GIT_AUTHOR_NAME.
    • End Tags (format: @@author): Optional. An end tag indicates the end of a code segment written by the author identified by the AUTHOR_GIT_AUTHOR_NAME of the start tag.

    If an end tag is not provided, the code till the next start tag (or the end of the file) will be attributed to the author specified in the start tag above. Use only when necessary to minimize polluting your code with these extra tags.

    If an end tag is provided without a corresponding start tag, the code until the next start tag, the next end tag, or the end of the file, will not be attributed to any author. This should only be used if the code should not be attributed to any author.

    The @@author tags should be enclosed within a single-line comment, using the comment syntax of the file in concern. Below are some examples:

    author tags

    Currently, the following comment formats are supported:

    • // @@author authorName
    • /* @@author authorName */
    • /* @@author authorName
    • # @@author authorName
    • % @@author authorName
    • <!-- @@author authorName -->
    • <!--- @@author authorName --->
    • [//]: # (@@author authorName)

    RepoSense checks whether the line matches the supported comment formats. If the line does not match the formats, -RepoSense treats it as a normal line.

    The code until the next start tag, the end tag, or the end of file will be attributed to that author.

    Note: Remember to commit the files after the changes. (reason: RepoSense can see committed code only)

    Special thanks to Collate project for providing the inspiration for this functionality.

    +RepoSense treats it as a normal line.

    The code until the next start tag, the end tag, or the end of file will be attributed to that author.

    Note: Remember to commit the files after the changes. (reason: RepoSense can see committed code only)

    Special thanks to Collate project for providing the inspiration for this functionality.

    diff --git a/ug/usingAuthorTags.page-vue-render.js b/ug/usingAuthorTags.page-vue-render.js index 111a7f6b28..4d282a0528 100644 --- a/ug/usingAuthorTags.page-vue-render.js +++ b/ug/usingAuthorTags.page-vue-render.js @@ -38,6 +38,6 @@ with(this){return _c('p',[_v("Note: Remember to "),_c('strong',[_v("commit")]),_ with(this){return _c('p',[_v("Special thanks to "),_c('a',{attrs:{"href":"https://github.com/se-edu/collate"}},[_v("Collate project")]),_v(" for providing the inspiration for this functionality.")])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/usingReports.html b/ug/usingReports.html index b1c224adf5..c60c0d3847 100644 --- a/ug/usingReports.html +++ b/ug/usingReports.html @@ -32,7 +32,7 @@
  • Clicking the file title toggles the file content.
  • Clicking the first icon beside the file title opens the history view of the file on the remote repository.
  • Clicking the second icon beside the file title opens the blame view of the file on the remote repository.
  • When using the code panel for a specific author, code attributed to the author is highlighted in green.
  • Non-trivial code segments that the selected author has not written are hidden by default, but you can toggle them by clicking on the icon.
  • Changing binary files, such as images (.jpg, .png), applications (.exe), zip files (.zip, .rar) and certain document types (.docx, .pptx), is not counted towards the total number of lines of code contributed by an author.

    Commits panel

    commits panel

    The Commits panel allows users to see the commits attributed to a specific author.

    Opening commits panel

    + diff --git a/ug/usingReports.page-vue-render.js b/ug/usingReports.page-vue-render.js index 08e6bc19b5..77a0994cb3 100644 --- a/ug/usingReports.page-vue-render.js +++ b/ug/usingReports.page-vue-render.js @@ -86,6 +86,6 @@ with(this){return _c('p',[_c('a',{attrs:{"href":"/RepoSense/images/opening-commi with(this){return _c('ul',[_c('li',[_v("The commits can be sorted by the date it was committed or by LoC.")]),_v(" "),_c('li',[_v("The tags of the commits will also be displayed on top if any. Clicking on a tag will direct you to the commit having that particular tag.")]),_v(" "),_c('li',[_v("The date range for the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Chart panel")]),_v(" can be updated by clicking on the \"Show ramp chart for this period\" below the name of the author.")]),_v(" "),_c('li',[_v("The ramp chart at the top of the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Commits panel")]),_v(" represents individual commits (not weekly or daily contributions).")]),_v(" "),_c('li',[_v("The commit messages body can be expanded or collapsed by clicking on the "),_c('span',{staticClass:"dimmed"},[_c('span',{staticClass:"fas fa-ellipsis-h",attrs:{"aria-hidden":"true"}})]),_v(" icon beside each commit message title.")]),_v(" "),_c('li',[_v("To promote and encourage the 50/72 rule for commit messages, a dotted vertical line will be shown for:\n"),_c('ul',[_c('li',[_v("Commit message subject that exceeds 50 characters.")]),_v(" "),_c('li',[_v("Commit message body after the 72nd character mark.")])])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/withGithubActions.html b/ug/withGithubActions.html index e37cdeede0..6f257805ee 100644 --- a/ug/withGithubActions.html +++ b/ug/withGithubActions.html @@ -15,7 +15,7 @@

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: RepoSense with GitHub Actions

    You can use GitHub Actions (together with other GitHub tools) to automate the generating and publishing of RepoSense reports.

    Setting up

    The instructions below assume you are using GitHub pages to host your report.

    Step 1 Fork the publish-RepoSense repository using this link. Optionally, you can rename the fork to match your RepoSense report e.g., project-code-dashboard.

    Step 2 Activate GitHub Actions on the forked repository:

    1. Go to the Actions page of your fork of the publish-RepoSense repo.
    2. Click on the green button that says I understand my workflows, go ahead and enable them to enable GitHub Actions on your new repository.

    Step 3 Update report configuration:

    In your fork, edit run.sh (and if applicable, repo-config.csv, author-config.csv, group-config.csv) to customize the command line parameters or repositories to be analyzed.

    Step 4 View the generated report:

    To access your regenerated RepoSense report, go to the settings of your fork in GitHub, under GitHub Pages section, look for Your site is published at [LINK]. It should look something like https://[YOUR_GITHUB_ID].github.io/publish-RepoSense. -GitHub Setting

    There is also a published GitHub Action (reposense-action) that can be used to generate and publish RepoSense reports. It is especially convenient for users who wish to skip the forking and setting up of a separate repository. For more information, refer to the usage description.

    Updating the report

    Manual:

    • You can trigger GitHub to re-generate and re-deploy the report by pushing an empty commit to your fork.
    • Currently, the GitHub Actions UI does not support the manual execution of workflows.

    Automated: GitHub actions can be set to run periodically.

    1. Edit the .github/workflows/main.yml and uncomment the schedule: section.
    2. You may change the expression after cron: to a schedule of your choice. Read more about cron syntax here.
    3. Commit your changes.
    +GitHub Setting

    There is also a published GitHub Action (reposense-action) that can be used to generate and publish RepoSense reports. It is especially convenient for users who wish to skip the forking and setting up of a separate repository. For more information, refer to the usage description.

    Updating the report

    Manual:

    Automated: GitHub actions can be set to run periodically.

    1. Edit the .github/workflows/main.yml and uncomment the schedule: section.
    2. You may change the expression after cron: to a schedule of your choice. Read more about cron syntax here.
    3. Commit your changes.
    diff --git a/ug/withGithubActions.page-vue-render.js b/ug/withGithubActions.page-vue-render.js index 1cb1a2e603..b581cd8aff 100644 --- a/ug/withGithubActions.page-vue-render.js +++ b/ug/withGithubActions.page-vue-render.js @@ -41,6 +41,6 @@ with(this){return _c('p',[_v("To access your regenerated RepoSense report, go to with(this){return _c('div',{attrs:{"id":"section-updating-the-report"}},[_c('h2',{attrs:{"id":"updating-the-report"}},[_v("Updating the report"),_c('a',{staticClass:"fa fa-anchor",attrs:{"href":"#updating-the-report","onclick":"event.stopPropagation()"}})]),_v(" "),_c('p',[_c('strong',[_v("Manual:")])]),_v(" "),_c('ul',[_c('li',[_v("You can trigger GitHub to re-generate and re-deploy the report by pushing an empty commit to your fork.")]),_v(" "),_c('li',[_v("Currently, the GitHub Actions UI does not support the manual execution of workflows.")])]),_v(" "),_c('p',[_c('strong',[_v("Automated:")]),_v(" GitHub actions can be set to run periodically.")]),_v(" "),_c('ol',[_c('li',[_v("Edit the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v(".github/workflows/main.yml")]),_v(" and uncomment the "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("schedule:")]),_v(" section.")]),_v(" "),_c('li',[_v("You may change the expression after "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("cron:")]),_v(" to a schedule of your choice. Read more about cron syntax "),_c('a',{attrs:{"href":"https://help.github.com/en/actions/reference/events-that-trigger-workflows#scheduled-events-schedule"}},[_v("here")]),_v(".")]),_v(" "),_c('li',[_v("Commit your changes.")])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/withNetlify.html b/ug/withNetlify.html index 745941b19b..f55a326c98 100644 --- a/ug/withNetlify.html +++ b/ug/withNetlify.html @@ -19,7 +19,7 @@ Netlify Preview

    Updating the report

    Manual: Netlify UI has a way for you to trigger a build, using which you can cause the report to be updated.

    Automated: Netlify's can be set up to update the report whenever a target repo of your report is updated, provided you are able to update the target repos in a certain way.

    1. Click on Settings in the top, choose Build & deploy from the left panel and scroll to Build hooks. Build hooks

    2. Click Add build hook, give your webhook a name, and choose the master branch to build. A Netlify URL will be generated.

    3. Go to your target repository (the repository you want to analyze) and click on Settings.

    4. Select Webhooks on left panel and click on Add webhook. Add webhook

    5. Copy the Netlify URL and paste it in the URL form field. -Webhook url

      Note: Although the build url is not that secretive, it should be kept safe to prevent any misuse.

    6. Select application.json as content type.

    7. Select Let me select individual events and based on your requirements check the checkboxes.

    8. Leave the Active checkbox checked.

    9. Click on Add webhook to save the webhook and add it.

    +Webhook url

    Note: Although the build url is not that secretive, it should be kept safe to prevent any misuse.

  • Select application.json as content type.

  • Select Let me select individual events and based on your requirements check the checkboxes.

  • Leave the Active checkbox checked.

  • Click on Add webhook to save the webhook and add it.

  • diff --git a/ug/withNetlify.page-vue-render.js b/ug/withNetlify.page-vue-render.js index 7a510b64ac..021c66e350 100644 --- a/ug/withNetlify.page-vue-render.js +++ b/ug/withNetlify.page-vue-render.js @@ -68,6 +68,6 @@ with(this){return _c('li',[_c('p',[_v("Leave the "),_c('strong',[_v("Active")]), with(this){return _c('li',[_c('p',[_v("Click on "),_c('strong',[_v("Add webhook")]),_v(" to save the webhook and add it.")])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file diff --git a/ug/withTravis.html b/ug/withTravis.html index f67c62469e..6788885b38 100644 --- a/ug/withTravis.html +++ b/ug/withTravis.html @@ -16,7 +16,7 @@ Search

    You are looking at the user documentation for the most recent master branch of RepoSense (not released to the public yet). The documentation for the latest public release is here.

    Appendix: RepoSense with Travis

    You can use the CI tool Travis to automate generating and publishing of RepoSense reports.

    Setting up

    The instructions below assume you are using GitHub pages to host your report.

    Step 1 Fork the publish-RepoSense repository using this link. Optionally, you can rename the fork to match your RepoSense report e.g., project-code-dashboard.

    Step 2 Generate a personal access token or deploy key on GitHub as explained in the panel below.

    Step 3 Login to Travis-CI. You may have to sign up first.

    Step 4 Sync your Travis account with GitHub:

    1. Go to your account.
    2. Click on Sync account to fetch all your repositories into Travis-CI.

    Step 5 Activate the repository:

    1. Go to your publish-RepoSense fork in Travis-CI
    2. Under Current tab, click on Activate repository.

    Step 6 Set the token/key:

    1. In the same page, click on More options on the right.
    2. Then, click on the Settings option:
      Travis-CI Dashboard
    3. Under Environment Variables, name a variable as GITHUB_TOKEN or GITHUB_DEPLOY_KEY depending on your earlier choice and paste the token/key into its value field; then click Add.
    4. Ensure that the Display value in build log is switched off for security reasons:
      Travis-CI Environment Variable

    Step 7 Update the report configuration:

    In your fork, edit run.sh (and if applicable, repo-config.csv, author-config.csv, group-config.csv) to customize the command line parameters or repositories to be analyzed.

    Step 8 View the generated report:

    1. Go to the Settings page of your fork in GitHub.
    2. Under the GitHub Pages section, look for Your site is published at [LINK]. It should look something like https://[YOUR_GITHUB_ID].github.io/publish-RepoSense. GitHub Setting

    It takes a few minutes for report generation. Meanwhile, you can monitor the progress live at Travis-CI's Builds.

    Updating the report

    Manual: Travis UI has a way for you to trigger a build, using which you can cause the report to be updated.

    1. Go to your fork in Travis-CI, click on More options on the right then Trigger build.
    2. In the pop up, click Trigger custom build.

    Automated: Travis-CI offers Cron Jobs in intervals of daily, weekly or monthly.

    1. Login to Travis-CI.
    2. Go to your fork in Travis-CI, click on More options on the right then access Settings.
    3. Under Cron Jobs, choose master for Branch, Always run for Options and pick an Interval of your choice; then click Add. -Travis-CI Cron
    +Travis-CI Cron diff --git a/ug/withTravis.page-vue-render.js b/ug/withTravis.page-vue-render.js index 79b9842361..b0d6df5827 100644 --- a/ug/withTravis.page-vue-render.js +++ b/ug/withTravis.page-vue-render.js @@ -71,6 +71,6 @@ with(this){return _c('p',[_c('strong',[_v("Automated:")]),_v(" "),_c('a',{attrs: with(this){return _c('ol',[_c('li',[_v("Login to "),_c('a',{attrs:{"href":"https://travis-ci.org/"}},[_v("Travis-CI")]),_v(".")]),_v(" "),_c('li',[_v("Go to "),_c('a',{attrs:{"href":"https://travis-ci.org/search/publish-RepoSense/"}},[_v("your fork in Travis-CI")]),_v(", click on "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("More options")]),_v(" on the right then access "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Settings")]),_v(".")]),_v(" "),_c('li',[_v("Under "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Cron Jobs")]),_v(", choose "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("master")]),_v(" for "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Branch")]),_v(", "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Always run")]),_v(" for "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Options")]),_v(" and pick an "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Interval")]),_v(" of your choice; then click "),_c('code',{pre:true,attrs:{"class":"hljs inline no-lang"}},[_v("Add")]),_v(".\n"),_c('a',{attrs:{"href":"/RepoSense/images/publishingguide-cronsetting.jpg","target":"_self"}},[_c('img',{staticClass:"img-fluid",attrs:{"src":"/RepoSense/images/publishingguide-cronsetting.jpg","alt":"Travis-CI Cron","title":"Travis-CI Cron"}})])])])} },function anonymous( ) { -with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sat, 18 May 2024, 14:34:27 UTC]")])])])} +with(this){return _c('footer',[_c('div',{staticClass:"text-center"},[_c('small',[_v("["),_c('span',[_c('strong',[_v("Powered by")])]),_v(" "),_c('img',{attrs:{"src":"https://markbind.org/favicon.ico","width":"30"}}),_v(" "),_c('a',{attrs:{"href":"https://markbind.org/"}},[_v("MarkBind 5.5.2")]),_v(", generated on Sun, 14 Jul 2024, 15:29:16 UTC]")])])])} }]; \ No newline at end of file