Vim License 的故事(下)

Vim License on choosealicense

接續前一篇

Mike 在 SPDX License List 這邊提出的問題則是,為什麼會有 Vim 要替換,但是 Vim Maintainer 不要替換這樣特別的情形,所以我就是認真的解釋,並且說明這是跟原作者 Bram 確認過的細節並附上討論,還有舉我前面提過那個最極端的例子,然後我猜最重要的是現實世界有沒有人這樣使用過,還好我還真的找到幾個專案有認真的把條款內的 Vim 替換掉(當然是連 Vim Maintainer 也換掉了),像是 Tagbar;我的 PR 是 2019/07/11 提的,然後一直來回到 9/25 回了最後一個回應之後就沒人回我了,之後到了 10/19 就突然被合併了(其實 SPDX 有定期的會議,應該是在其中有討論過要不要合併這個 PR 吧),接著等到 2020 一月我發了 PR 到 choosealicense 把 vim.txt 加進去,這次就蠻順利就合併了。

解決了上游問題,回到 Licensee 偵測的問題,我本來的 PR 沒被合併,而是 Mike 另外弄了一個比較通用的解法,是根據條款文本內的替換字串來動態調整差異的容許範圍,然後接著 2020/03/13,Licensee 9.13.1 作為第一版支援 Vim License 的 Licensee 發佈了,接下來,我理論上就只要等 GitHub 更新 Licensee 的版本就好了,這我倒是不太擔心,我是有種感覺 GitHub 是有在認真更新這些東西的,然後,時間快轉到三個月後,這段期間其實我都有偶爾上去 GitHub 看一下 Vim License 有沒有被偵測出來,想著要是終於完成的話就可以投個稿了,當時的時間大概是搞了三年這樣,總之因為過有點久了,我又去拉了最新版 Licensee 來測試,結果讓我嚇了一跳,竟然偵測不出來了!

Licensee 9.13.1

所以我又花時間下去查原因,結果是 2020/05/12 的 9.14 開始爛掉的,Mike 在 9.14 有修改一部分的演算法,在比對兩份文件時,因為有替換字串的關係,不可能用完全比對的方式,所以在有替換字串時,文件的長度差異會影響相似度,有個動態的max_delta,如果替換字串後長度差異太大超過max_delta的話,就會被判定為不同的文件,在 9.14 則是把這個機制拿掉,直接把替換字串的影響弄進相似度之中,不過其中長度差異的懲罰太大,結果造成 Vim 專案本身的判斷失準,發現原因之後,我就發了 PR 調整懲罰的參數,讓 Vim 剛好可以過關這樣,結果我發 PR 時 Mike 早已經發現這個問題,也已經修改好開了 PR 只是還在 review,而該 PR 的方法是則是動態的根據替換字串的數量來調整文件長度差異的值,除此之外,Vim License 還被加到測試之中,所以以後應該不會再發生這種問題了。

然後,我就等這個 PR merge 等了三個月,不過還好 merge 後馬上就發佈 9.14.1 了,接著又回到等 GitHub 更新的時間了,我就一直等,一直等,偶爾上去 GitHub 的 Vim repo 確認一下,2021 年初我還寫信去 GitHub Support 問他們當時使用的版本是哪一版,Support 還有認真去幫我確認是沒更新,然後就這樣一直等一直等到 2022 年初,有天在用 GitHub 的搜尋功能時,突然發現到,可以用條件設定搜尋特定授權條款的專案,然後我就想說可以來試試看 Vim License:license:vim,結果竟然有符合條件的專案出現!讓我大吃一驚!原來不知何時 GitHub 已經偵測的到 Vim License 了,可是 Vim 那個 repo 結果卻還是不正確,深入了解一下,推測應該是 GitHub 有 cache 機制,找了一下文件發現到有提到說如果有發現專案的授權條款標示不正確,可以聯絡 support,於是我就發了 support request,這次很快就收到回應,然後在 2022/01/12 這天,確認了 GitHub 上的 Vim 專案有正確的顯示為 Vim License 了,歷時將近五年,那天我還發推慶祝了一下。

Search result of Vim Licensed repo

之後,終於可以準備投稿,然後順利投上 2022 年的 COSCUP,題目是「歷時五年的開源貢獻,GitHub 支援 Vim License 的故事」(影片投影片),在準備分享的過程也是遭受很多的電玩干擾阻力,分享過程還算順利,自己有點小不滿意不過還算可以接受,不滿意的地方是有些我一開始有想要分享的點忘了說,不過也是在這篇文章有補齊了。

其實在初期那段等待的時間之間,我還開了一個小專案 Vim License Gen,用來幫人產生自己的專案/軟體用的 Vim License 文件,為什麼要有這個工具是因為以前的純文字文件,每行的寬度大概都在 80 個字元以內,但是每個專案的名稱都不一樣,如果直接做替換,有可能會破版,所以這個工具一是會保持版面,二是它可以正確的只替換需要替換的部分,然後這個專案就是用 Vim License 開源,並且是用自己產生 Vim License 文件,然後我也把他列為使用 Vim License 的三個專案之一(另外兩個分別是 Vim 和 vim-pathogen),這也是個 self-hosting 的實現。

Vim License Gen

故事並沒有到這邊就結束,COSCUP 分享之後的目標就是把這篇文章寫下來了,不過一拖再拖,其中一個主因是以前我是先把文章寫好順便作整理,但是這次因為準備時間不夠,無法在分享前先把文章寫好,變成後寫,沒了趕稿壓力,加上又有像是王國之淚等讓人分心的東西,就一直無限期拖搞,直到今年 2023/08/05 傳出了 Vim 的作者 Bram Moolenaar 於八月三日因病過世的消息了。

Bram 過世之後,除了緬懷之外,大家也會擔心起 Vim 的後續誰維護的問題,還好 Vim GitHub 組織內還有另外兩位成員,其中 Christian Brabandt 算是接起主持人的角色,他同時也是我用很久的 vim-airline 的作者,然後很快的也發了 PR 做了一些相關的修改,像是在 doc 裡面緬懷 Bram、更新檔案內的維護者資訊等,只不過其中一項修改,改到了 LICENSE 檔案!改的地方當然就是那個高度耦合的 Vim Maintainer 的部分:

The current maintainer is Bram Moolenaar Bram@vim.org.

改成

The current maintainers are listed here: https://github.com/orgs/vim/people.

然後我還是被 ping 了才知道這 PR 已經合併,這下我可緊張了,其實我本來也是有在想 Vim License 的問題,只不過想說 Bram 才剛過世,可以晚點再提出,當時有想了幾個方案,理想上要能同時繼續支援現有的使用 Vim License 的專案、然後也要能讓授權條款內的文字正確的更新,不過當時不管哪個方案,都無法保證兩全齊美,當時想的方案為:

  • 方案一:更改條款內文並且發布新版,可能是叫 Vim License 1.1 之類的,缺點是可能需要重新提交提交新版的條款到 choosealicense,但是現況來看幾乎不可能符合提交的一千個專案的條件;
  • 方案二:更改條款內文,繼續用一樣的條款名,不推修改到 choosealicense,缺點是 Licensee 可能辨認不出來,結果就是 Vim 專案自己無法被辨識為使用 Vim License;
  • 方案三:同二,但是該推送修改的地方如 SPDX License List 和 choosealicense 都送,缺點是使用舊版授權條款文字的可能都再也辨認不出來,另一個問題是這樣的變化 Mike 是否會接受?

就之前的紀錄,當時版本偵測出來的相似度也只有 98.45%,這樣一改下去,會不會就爆炸又偵測不出來了呢,於是我趕快找了個時間拉最新版的 Vim 和 Licnesee 下來測試,結果,竟然還是 98.45%,這結果又讓我驚呆了,直覺是因為 Licensee 的演算法改的更好了,一查下去,原來剛好在今年初的 Licensee 9.16.0 其中的一項修改就是針對替換字串提供更高的差異容許範圍,所以舊版 Vim License 下去比對會有 99.12% 的相似度,剛好足夠新版修改後的差異,而這結果就剛好克服了方案三的缺點,所以接下來應該就是會朝這個方向進行,先提交新版的文字給 SPDX License List,然後再更新 choosealicense 內的範本吧。

Vim License detection

以上,就是到目前為主的故事了,最後想來作一個總結,也就是談談當初為什麼想在 COSCUP 分享這個呢?其實我當初假想的聽眾是開源的新手,我想分享的其中一點是,對於開源專案的貢獻,我完全是照自己的步調,也不給任何一邊壓力,所有的等待過程我都沒去催促過任何人,不過標題的「五年」或許造成反效果也說不定,投稿時 Rock 有建議過我可以調整一下標題,不過我實在是想不到什麼其他好標題,結果就都沒改,後來,當天在我的前一場是 Max 的「開源軟體與社群 - 參與國際社群經驗談」(影片),就有提到這點,可以選擇你最舒服的方式參與,不用害怕參與;第二點想分享的東西則是關於在這個過程中學到的東西,像是 Licensee 的判斷原理,SPDX 相關的東西,和各個群體溝通的過程,很多東西都是我之前並不清楚的,像是我以前知道有個 SPDX License Indentifier,但是並不清楚 SPDX 是搞什麼用的,然後它們有維護 License List,甚至授權條款文本裡面可以有替換字串等,我覺得這些都是蠻有趣的知識;最後一點則是分享這一整個過程,中間一波三折,坑坑相連到天邊的轉折,我自己都覺得很有趣。

以下列出我一路以來開過的 PR、Issue 和討論:

最後的最後就來個簡單的 timeline 吧:

- 2013/07/15 Choose a license released
- 2016/09/21 Display/detect the license
- 2017/03/26 Open issue to choosealicense
- 2018/06/15 First issue closed
- 2019/06/23 Discuss the License text with Bram
- 2019/06/27 Issue about Vim License detection
- 2019/07/11 SPDX PR
- 2019/09/25 Last comment of the SPDX PR
- 2019/10/19 SPDX PR merged
- 2020/01/08 PR add License to Vim
- 2020/01/18 PR add License to vim-pathogen
- 2020/01/21 PR add vim.txt to choosealicense
- 2020/03/13 Licensee 9.13.1 released, Vim added
- 2020/05/12 Licensee 9.14 release, Vim detection failed
- 2020/07/04 PR to fix detection issue
- 2020/10/14 Issue fix merged v9.14.1
- 2021/02/05 Contact GitHub support 1st time
- 2022/01/12 Contact GitHub support 2nd time, 確認上線
- 2022/05/22 投稿、開始寫文章
- 2022/07/29 COSCUP 2022
- 2023/08/03 Bram Passed away
- 2023/08/13 Vim License file updated
- 2023/09/04 再次開始寫文章
- 2023/09/12 發表文章