Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

尝试添加北航盘上传(未测试) #56

Draft
wants to merge 3 commits into
base: master
Choose a base branch
from
Draft

尝试添加北航盘上传(未测试) #56

wants to merge 3 commits into from

Conversation

Operacon
Copy link

@Operacon Operacon commented Oct 5, 2021

修改 judger/src/fs/net.rs,将原通过 git 获取代码的函数增加一个 if,如果 branch 名为 bhpan,那么将 repo 地址视为通过北航盘分享的zip文件的链接,通过 curl 下载,并解压到当前 job 工作目录。

例如,被分享的文件链接为,https://bhpan.buaa.edu.cn/link/114E514 或者 https://bhpan.buaa.edu.cn/#/link/114E514,首先通过截取字符串获得源文件真实的 id ,即fid = "114E514"。随后调用已有的 do_command!(),打开 sh,并传入一个被压缩成一句的指令

x=`curl --location --request POST 'https://bhpan.buaa.edu.cn/api/v1/link/osdownload' --header 'Content-Type: application/json' --data-raw '{\"link\":\"114E514\",\"reqhost\":\"bhpan.buaa.edu.cn\",\"usehttps\": true}'`&&x=`echo ${x%\\\"]*}`&&x=`echo ${x#*,\\\"}`&&curl --location --request GET $x --output code.zip

该指令成功执行后会将被分享的文件下载为 code.zip。随后继续调用 do_command!() 通过 unzip 将其解压到工作目录,函数返回,达到了和通过 git 获取代码同样的效果。

@lynzrand
Copy link
Member

lynzrand commented Oct 5, 2021

可以考虑添加新的下载方式,但是我认为这个 PR 提出的设计有几个问题:

  1. 通过 branch 设定 repo 太过于 hack 了,兼容性差且不利于后续添加新功能。如果要实现的话,不如添加一个新的 field 来指示文件来源(是上传还是 git 仓库)
  2. 北航盘的通用性太弱。如果必须要上传文件的话,不如直接使用服务器连接的 S3 对象存储来存储文件。
  3. 使用 curl 下载的话会增加对外部程序的依赖。如果可能的话还是使用内置的 HTTP 库,如 reqwest,来实现。
  4. 当初设计本项目时没有做文件上传的原因是,文件上传会占用存储空间(因为不能去重)以及不利于版本管理。Rurikawa 并不是一个通用 OJ,上传功能确实不在当前的设计范围以内。

有人来维护 Rurikawa 我很高兴,但是添加提交方式这么大的事情感觉还是先在 Issue 区讨论出一个确定的方案来再实现比较好。

@lynzrand lynzrand added enhancement New feature or request question Further information is requested labels Oct 5, 2021
@lynzrand
Copy link
Member

lynzrand commented Oct 5, 2021

哦,差点忘了。为了保证评测任务的可重复性,git branch 在服务端就会被解析成提交时当前 branch 最新的提交,所以发到 judger 上的 revision 已经是准确的 git commit ID 而不是 branch name 了。因此在任何时候 revision 都不会等于 bhpan

)]);
do_command!(dir, ["unzip", "code.zip"]);
}
Ok(())
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里应该返回的

if &options.revision == "bhpan" {
let bytes = &options.repo.as_bytes();

// cut 'https://bhpan.buaa.edu.cn/link/'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

用正则表达式不好么

@@ -108,6 +108,36 @@ pub async fn git_clone(dir: &Path, options: GitCloneOptions) -> std::io::Result<

tokio::fs::create_dir_all(dir).await?;

if &options.revision == "bhpan" {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

options.revision 由于评论区提到的原因永远不可能是 bhpan,所以这个分支永远不会执行到

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request question Further information is requested
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants