diff --git a/dev/google-drive-files/README.md b/dev/google-drive-files/README.md index 14eca02..32fe446 100644 --- a/dev/google-drive-files/README.md +++ b/dev/google-drive-files/README.md @@ -34,13 +34,17 @@ Usage: ./generate-file-ids.rb NEXT_VERSION Example: ```console -$ ./generate-file-ids.rb 1.1 -1rf8L-TygYD0FyNEFpG5yzvrz0aRzQWa_ STEP (assembly)/OpenArm_v1.1_leader.STEP -1KxRKvIAmEH6EU9x1paPJFVpmgKq8uA98 STEP (assembly)/OpenArm_v1.1_follower.STEP -1m8ul01bEsziC8pWXq_DLDx7sHWk3GIby Wiring/J1_J2.pdf -... +$ ./generate-file-ids.rb 2.0 > file-ids.tsv +$ head -n 3 file-ids.tsv +1mP0gDFgGaX6Ufobr8ocyg71ccsYgfBDw OpenArm 2.0/Options/OpenArm_2.0_w_Head_Camera.STEP +15p1PYmEKcDmnYQ5Hy_trM8gIoFCADF5a OpenArm 2.0/OpenArm 2.0 BOM.xlsx +1aU-V3lt_aPrZoRM8FFx6dMQu2f28Ws0I OpenArm 2.0/OpenArm_2.0.STEP ``` +Only files in the `Hardware/` directory of the specified version +such as `v2.0/Hardware/` are included. `v2.0/` and `Hardware/` are +omitted from the path. + ## `file-ids.tsv` This is a commit of file automatically generated by `generate-file-ids.rb`. diff --git a/dev/google-drive-files/file-ids.tsv b/dev/google-drive-files/file-ids.tsv index 91b0615..b837099 100644 --- a/dev/google-drive-files/file-ids.tsv +++ b/dev/google-drive-files/file-ids.tsv @@ -1,40 +1,40 @@ -1mP0gDFgGaX6Ufobr8ocyg71ccsYgfBDw v2.0/Hardware/OpenArm 2.0/Options/OpenArm_2.0_w_Head_Camera.STEP -15p1PYmEKcDmnYQ5Hy_trM8gIoFCADF5a v2.0/Hardware/OpenArm 2.0/OpenArm 2.0 BOM.xlsx -1aU-V3lt_aPrZoRM8FFx6dMQu2f28Ws0I v2.0/Hardware/OpenArm 2.0/OpenArm_2.0.STEP -1xHMssSOp9RfZD1K6H80Yyl4uTlpU3lTc v2.0/Hardware/OpenArm 2.0/README.docx -1dZNUfoNDauqLoxLAgfdjrjm5wZEi3KGA v2.0/Hardware/OpenArm Cell/Elec/CELL_WIRING.pdf -1BpHJtbkg-uVoz8ZZrl4nGJyacPUTmq8F v2.0/Hardware/OpenArm Cell/Elec/CELL_WIRING.xlsx -1-R55Idf_G9TvjUsMl-cZ8esXmvPLjKyC v2.0/Hardware/OpenArm Cell/Elec/PWR-CIRCUIT-DIN-RAIL-BUS_2.zip -1o3eUXLWWgTuWCb5OTmLyBQvEH0nXxT0w v2.0/Hardware/OpenArm Cell/Integration with OpenArm/OpenArm_Cell+OpenArm_2.0.STEP -1qOt1T4XzuH-iukmT8rXmuCF_NDZwrPSZ v2.0/Hardware/OpenArm Cell/Integration with OpenArm/OpenArm_Cell_cover_a.STEP -1lne22UpsztWr2t0TdqJxpJoMEt5Z6LGA v2.0/Hardware/OpenArm Cell/Integration with OpenArm/OpenArm_Cell_cover_b.STEP -1V3CDlTN64f95u9gtATIn5wNTBGyUE3tx v2.0/Hardware/OpenArm Cell/JIG/OpenArmJIG.STEP -1Ak9ZRbhdeep9R8xsPZbKWIEbY99sg-Am v2.0/Hardware/OpenArm Cell/JIG/OpenArmJIG_BOM.xlsx -1KojBKJe4hC0Oqus8LIUvfkKwnr3xQx3F v2.0/Hardware/OpenArm Cell/OpenArm Cell BOM.xlsx -1il0ruNigmZ_AfcUPyRAz_hEbmok7gWX4 v2.0/Hardware/OpenArm Cell/OpenEvalCell_defeature.SLDPRT -1CBgghd7gDeWnKbbH2SOlk3yypSj0Dy5a v2.0/Hardware/OpenArm Cell/OpenEvalCell_defeature.STEP -1SmF1Q4BQa-QwytB2GYu1YTOXWrtz8T__ v2.0/Hardware/OpenArm Cell/README.docx -1lFlYdutOH_qJoYCRDOVx_52406vT6uQZ v2.0/Hardware/OpenArm KER/Elec/Cable/KER_CABLE_E.png -165fgBqdHhQrPrDKcQ2ChiE1o8Egzvneh v2.0/Hardware/OpenArm KER/Elec/Cable/KER_CABLE_TOPO.png -10UM2Gz6qYCFwZwsiwa-YFEEOoj03MdE8 v2.0/Hardware/OpenArm KER/Elec/Cable/KER_System_Cable_Documentation_GoogleDocs.docx -1k6zJDhChShjfUxtmVolK55WeUalUOB73 v2.0/Hardware/OpenArm KER/Elec/Cable/XL2605270113-1.pdf -1BhYj9wDtuzjDPiUB79oO1CzT8MO2fW4W v2.0/Hardware/OpenArm KER/Elec/Cable/XL2605270113-2.pdf -1d2mmarW1wPEjvqmleEGBnS4tBeFIQRIk v2.0/Hardware/OpenArm KER/Elec/Cable/XL2605270113-3.pdf -15oduBPeBB_mvUxIssYLczjaK1JEAhQLR v2.0/Hardware/OpenArm KER/Elec/Cable/XL2605270113-4.pdf -116fQx4wdkW6PI5701_fPMBiE-dL3jFkN v2.0/Hardware/OpenArm KER/Elec/PCB/Encoder/Gerber_PCB2_5_2026-05-26.zip -1AsExdG6gjag34Bm5OCkV7l06xHI7n0JB v2.0/Hardware/OpenArm KER/Elec/PCB/Encoder/PickAndPlace_PCB2_5_2026_07_08.xlsx -1OUSSkXK_eH8Nuj2jC9KFM96A7DayR_nk v2.0/Hardware/OpenArm KER/Elec/PCB/Encoder/TLE_BOM.xlsx -1VBS0nRoqaKCasUxytcFdmCmuggOyAgJh v2.0/Hardware/OpenArm KER/Elec/PCB/Encoder/TLE_V3_BOM.csv -1PGFMlxTwNVaEApsOMtOu2dyte7oK4i2V v2.0/Hardware/OpenArm KER/Elec/PCB/Encoder/TLE_V3_PCB.pdf -1ZouTQ7XP46yTY4zb7zyZIrBTyxrGcYup v2.0/Hardware/OpenArm KER/Elec/PCB/Encoder/TLE_V3_SCH.pdf -1DT6S8nH_uEVGQ8Oq0kWuCKNv25_usvLO v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/2d.png -1wuVkOq1jqacCah-n8RlzZopptEpdE6o- v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/3d.png -1TnuaKxUKv-6MaXFQ8sizg6GM8fwEnZcw v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/BOM_M5_485Bus_21_M5_485Bus_21_2026-06-26.xlsx -1QFaPZBisLbQaFaUZuOU9ElYhD3Se32CZ v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/Gerber_M5_485Bus_21_2026-06-26.zip -1LS12aoe2XvksNp-gO-gARmlSx9lr3p3y v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/Gerber_M5_485Bus_21_2026-08-13.zip -1RWZfWAQ--UOX6SdjN2S5AEbvBdpRBnC9 v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/M5_485Bus_SCH.pdf -1NcvvQLV0GuhD0qJMuC_5LPs-KvzLs3BN v2.0/Hardware/OpenArm KER/Elec/PCB/M5Stack/PickAndPlace_M5_485Bus_21_2026-08-13.xlsx -1Su7q0tcZzUQrelV_wr5NAbwXlM4AE8qW v2.0/Hardware/OpenArm KER/OpenArm KER BOM.xlsx -1DWNSQFINY0sE20X86_kdmCDp1YGyWVNy v2.0/Hardware/OpenArm KER/OpenArm KER JIG BASE.STEP -1zlIPie9CycH_r2pLIHclKAHzV2yRIn3l v2.0/Hardware/OpenArm KER/OpenArm KER.STEP -1QCt_oB05_1-gnUoWseIl-wp4ZzqyQDysYyS23wMWsIw v2.0/Hardware/OpenArm KER/README.pdf application/vnd.google-apps.document +15p1PYmEKcDmnYQ5Hy_trM8gIoFCADF5a OpenArm 2.0/OpenArm 2.0 BOM.xlsx +1aU-V3lt_aPrZoRM8FFx6dMQu2f28Ws0I OpenArm 2.0/OpenArm_2.0.STEP +1mP0gDFgGaX6Ufobr8ocyg71ccsYgfBDw OpenArm 2.0/Options/OpenArm_2.0_w_Head_Camera.STEP +1xHMssSOp9RfZD1K6H80Yyl4uTlpU3lTc OpenArm 2.0/README.docx +1dZNUfoNDauqLoxLAgfdjrjm5wZEi3KGA OpenArm Cell/Elec/CELL_WIRING.pdf +1BpHJtbkg-uVoz8ZZrl4nGJyacPUTmq8F OpenArm Cell/Elec/CELL_WIRING.xlsx +1-R55Idf_G9TvjUsMl-cZ8esXmvPLjKyC OpenArm Cell/Elec/PWR-CIRCUIT-DIN-RAIL-BUS_2.zip +1o3eUXLWWgTuWCb5OTmLyBQvEH0nXxT0w OpenArm Cell/Integration with OpenArm/OpenArm_Cell+OpenArm_2.0.STEP +1qOt1T4XzuH-iukmT8rXmuCF_NDZwrPSZ OpenArm Cell/Integration with OpenArm/OpenArm_Cell_cover_a.STEP +1lne22UpsztWr2t0TdqJxpJoMEt5Z6LGA OpenArm Cell/Integration with OpenArm/OpenArm_Cell_cover_b.STEP +1V3CDlTN64f95u9gtATIn5wNTBGyUE3tx OpenArm Cell/JIG/OpenArmJIG.STEP +1Ak9ZRbhdeep9R8xsPZbKWIEbY99sg-Am OpenArm Cell/JIG/OpenArmJIG_BOM.xlsx +1KojBKJe4hC0Oqus8LIUvfkKwnr3xQx3F OpenArm Cell/OpenArm Cell BOM.xlsx +1il0ruNigmZ_AfcUPyRAz_hEbmok7gWX4 OpenArm Cell/OpenEvalCell_defeature.SLDPRT +1CBgghd7gDeWnKbbH2SOlk3yypSj0Dy5a OpenArm Cell/OpenEvalCell_defeature.STEP +1SmF1Q4BQa-QwytB2GYu1YTOXWrtz8T__ OpenArm Cell/README.docx +1lFlYdutOH_qJoYCRDOVx_52406vT6uQZ OpenArm KER/Elec/Cable/KER_CABLE_E.png +165fgBqdHhQrPrDKcQ2ChiE1o8Egzvneh OpenArm KER/Elec/Cable/KER_CABLE_TOPO.png +10UM2Gz6qYCFwZwsiwa-YFEEOoj03MdE8 OpenArm KER/Elec/Cable/KER_System_Cable_Documentation_GoogleDocs.docx +1k6zJDhChShjfUxtmVolK55WeUalUOB73 OpenArm KER/Elec/Cable/XL2605270113-1.pdf +1BhYj9wDtuzjDPiUB79oO1CzT8MO2fW4W OpenArm KER/Elec/Cable/XL2605270113-2.pdf +1d2mmarW1wPEjvqmleEGBnS4tBeFIQRIk OpenArm KER/Elec/Cable/XL2605270113-3.pdf +15oduBPeBB_mvUxIssYLczjaK1JEAhQLR OpenArm KER/Elec/Cable/XL2605270113-4.pdf +116fQx4wdkW6PI5701_fPMBiE-dL3jFkN OpenArm KER/Elec/PCB/Encoder/Gerber_PCB2_5_2026-05-26.zip +1AsExdG6gjag34Bm5OCkV7l06xHI7n0JB OpenArm KER/Elec/PCB/Encoder/PickAndPlace_PCB2_5_2026_07_08.xlsx +1OUSSkXK_eH8Nuj2jC9KFM96A7DayR_nk OpenArm KER/Elec/PCB/Encoder/TLE_BOM.xlsx +1VBS0nRoqaKCasUxytcFdmCmuggOyAgJh OpenArm KER/Elec/PCB/Encoder/TLE_V3_BOM.csv +1PGFMlxTwNVaEApsOMtOu2dyte7oK4i2V OpenArm KER/Elec/PCB/Encoder/TLE_V3_PCB.pdf +1ZouTQ7XP46yTY4zb7zyZIrBTyxrGcYup OpenArm KER/Elec/PCB/Encoder/TLE_V3_SCH.pdf +1DT6S8nH_uEVGQ8Oq0kWuCKNv25_usvLO OpenArm KER/Elec/PCB/M5Stack/2d.png +1wuVkOq1jqacCah-n8RlzZopptEpdE6o- OpenArm KER/Elec/PCB/M5Stack/3d.png +1TnuaKxUKv-6MaXFQ8sizg6GM8fwEnZcw OpenArm KER/Elec/PCB/M5Stack/BOM_M5_485Bus_21_M5_485Bus_21_2026-06-26.xlsx +1QFaPZBisLbQaFaUZuOU9ElYhD3Se32CZ OpenArm KER/Elec/PCB/M5Stack/Gerber_M5_485Bus_21_2026-06-26.zip +1LS12aoe2XvksNp-gO-gARmlSx9lr3p3y OpenArm KER/Elec/PCB/M5Stack/Gerber_M5_485Bus_21_2026-08-13.zip +1RWZfWAQ--UOX6SdjN2S5AEbvBdpRBnC9 OpenArm KER/Elec/PCB/M5Stack/M5_485Bus_SCH.pdf +1NcvvQLV0GuhD0qJMuC_5LPs-KvzLs3BN OpenArm KER/Elec/PCB/M5Stack/PickAndPlace_M5_485Bus_21_2026-08-13.xlsx +1Su7q0tcZzUQrelV_wr5NAbwXlM4AE8qW OpenArm KER/OpenArm KER BOM.xlsx +1DWNSQFINY0sE20X86_kdmCDp1YGyWVNy OpenArm KER/OpenArm KER JIG BASE.STEP +1zlIPie9CycH_r2pLIHclKAHzV2yRIn3l OpenArm KER/OpenArm KER.STEP +1QCt_oB05_1-gnUoWseIl-wp4ZzqyQDysYyS23wMWsIw OpenArm KER/README.pdf application/vnd.google-apps.document diff --git a/dev/google-drive-files/generate-file-ids.rb b/dev/google-drive-files/generate-file-ids.rb index 1535a1d..729dd0b 100755 --- a/dev/google-drive-files/generate-file-ids.rb +++ b/dev/google-drive-files/generate-file-ids.rb @@ -18,31 +18,46 @@ SCOPES = ["https://www.googleapis.com/auth/drive.readonly"] OPENARM_HARDWARE_FOLDER_ID = "14RM-fIPml0HTMnt2zcTXjNxJj9s2R_mG" -EXCLUDED_DIRECTORIES = ["Software", "Vendor"] +# Only files in "v${VERSION}/Hardware/" are included. "v${VERSION}/" +# and "Hardware/" are omitted from the path. +HARDWARE_DIRECTORY = "Hardware" def output?(name, version) return true unless /_v\d+\.\d+_/.match?(name) name.include?("_v#{version}_") end -def list_files(drive, folder_id, version, parent_path: "", page_token: nil) - response = drive.list_files( - q: "'#{folder_id}' in parents", - page_token: page_token - ) - if response.next_page_token - list_files( - drive, - folder_id, - version, - parent_path: parent_path, - page_token: response.next_page_token +def folder?(item) + item.mime_type == "application/vnd.google-apps.folder" +end + +def each_item(drive, folder_id) + return to_enum(__method__, drive, folder_id) unless block_given? + + page_token = nil + loop do + response = drive.list_files( + q: "'#{folder_id}' in parents", + order_by: "name", + page_token: page_token ) + response.files.each do |item| + yield(item) + end + page_token = response.next_page_token + break if page_token.nil? + end +end + +def find_folder(drive, folder_id, name) + each_item(drive, folder_id).find do |item| + folder?(item) and item.name == name end +end - response.files.each do |item| - if item.mime_type == "application/vnd.google-apps.folder" - next if EXCLUDED_DIRECTORIES.include?(item.name) +def list_files(drive, folder_id, version, parent_path: "") + each_item(drive, folder_id) do |item| + if folder?(item) list_files(drive, item.id, version, parent_path: "#{parent_path}#{item.name}/") elsif item.mime_type == "application/vnd.google-apps.document" # Google Docs can't be downloaded as is. The release job @@ -63,6 +78,17 @@ def list_files(drive, folder_id, version, parent_path: "", page_token: nil) puts "Usage: #{$0} NEXT_VERSION" exit false end +version = ARGV[0] drive = Google::Apis::DriveV3::DriveService.new drive.authorization = Google::Auth::ServiceAccountCredentials.from_env(scope: SCOPES) -list_files(drive, OPENARM_HARDWARE_FOLDER_ID, ARGV[0]) +version_folder = find_folder(drive, OPENARM_HARDWARE_FOLDER_ID, "v#{version}") +if version_folder.nil? + $stderr.puts "v#{version}/ doesn't exist" + exit false +end +hardware_folder = find_folder(drive, version_folder.id, HARDWARE_DIRECTORY) +if hardware_folder.nil? + $stderr.puts "v#{version}/#{HARDWARE_DIRECTORY}/ doesn't exist" + exit false +end +list_files(drive, hardware_folder.id, version)