Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions dev/google-drive-files/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
80 changes: 40 additions & 40 deletions dev/google-drive-files/file-ids.tsv
Original file line number Diff line number Diff line change
@@ -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
60 changes: 43 additions & 17 deletions dev/google-drive-files/generate-file-ids.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)