@@ -9,6 +9,7 @@ use serde_repr::{Deserialize_repr, Serialize_repr};
99use std::fs;
1010use std::fs::{File, OpenOptions};
1111use std::io::{Read, Write};
12+ use std::ops::RangeInclusive;
1213use std::path::{Path, PathBuf};
1314use std::sync::Arc;
1415use tracing::{debug, info};
@@ -75,25 +76,36 @@ impl DomainStorage {
7576 uploading_status
7677 .insert(domain_with_sub_path.clone(), uploading_version);
7778 }
78- if let Some(max_version) = max_version {
79- let path_buf = sub_dir.join(max_version.to_string());
80- let data = cache.cache_dir(
81- domain_dir_name,
82- Some(sub_path.as_str()),
83- max_version,
84- &path_buf,
85- )?;
86- cache.update(
87- domain_dir_name.to_string(),
88- Some(sub_path.as_str()),
89- max_version,
90- data,
91- );
79+
80+ if let Some(version) = max_version {
81+ for version in Self::get_init_version(version) {
82+ let path_buf = sub_dir.join(version.to_string());
83+ if sub_dir
84+ .join(version.to_string())
85+ .join(UPLOADING_FILE_NAME)
86+ .exists()
87+ {
88+ continue;
89+ }
90+ let data = cache.cache_dir(
91+ domain_dir_name,
92+ Some(sub_path.as_str()),
93+ version,
94+ &path_buf,
95+ )?;
96+ cache.update(
97+ domain_dir_name.to_string(),
98+ Some(sub_path.as_str()),
99+ version,
100+ data,
101+ );
102+ }
103+ let path_buf = sub_dir.join(version.to_string());
92104 match domain_version.get_mut(domain_dir_name) {
93105 Some(mut domain_meta) => {
94106 match domain_meta.value_mut() {
95107 DomainMeta::MultipleWeb(ref mut map) => {
96- map.insert(sub_path, (path_buf, max_version ));
108+ map.insert(sub_path.clone() , (path_buf, version ));
97109 }
98110 DomainMeta::OneWeb(..) => {
99111 panic!("init failure, {sub_dir:?} should be multiple web");
@@ -102,7 +114,7 @@ impl DomainStorage {
102114 }
103115 None => {
104116 let map = DashMap::new();
105- map.insert(sub_path, (path_buf, max_version ));
117+ map.insert(sub_path.clone() , (path_buf, version ));
106118 domain_version.insert(
107119 domain_dir_name.to_string(),
108120 DomainMeta::MultipleWeb(map),
@@ -117,16 +129,21 @@ impl DomainStorage {
117129 if let Some(uploading_version) = uploading_version {
118130 uploading_status.insert(domain_dir_name.to_string(), uploading_version);
119131 }
120- if let Some(max_version) = max_version {
132+ if let Some(version) = max_version {
133+ for version in Self::get_init_version(version) {
134+ let path_buf = path_prefix_buf
135+ .join(domain_dir_name)
136+ .join(version.to_string());
137+ let data =
138+ cache.cache_dir(domain_dir_name, None, version, &path_buf)?;
139+ cache.update(domain_dir_name.to_string(), None, version, data);
140+ }
121141 let path_buf = path_prefix_buf
122142 .join(domain_dir_name)
123- .join(max_version.to_string());
124- let data =
125- cache.cache_dir(domain_dir_name, None, max_version, &path_buf)?;
126- cache.update(domain_dir_name.to_string(), None, max_version, data);
143+ .join(version.to_string());
127144 domain_version.insert(
128145 domain_dir_name.to_string(),
129- DomainMeta::OneWeb(path_buf, max_version ),
146+ DomainMeta::OneWeb(path_buf, version ),
130147 );
131148 }
132149 }
@@ -143,6 +160,14 @@ impl DomainStorage {
143160 }
144161 }
145162
163+ fn get_init_version(version: u32) -> RangeInclusive<u32> {
164+ if version > 2 {
165+ version - 2..=version
166+ } else {
167+ 1..=version
168+ }
169+ }
170+
146171 fn get_multiple_path_data<'a>(
147172 domain_dir: &PathBuf,
148173 domain_dir_name: &'a str,
@@ -697,10 +722,10 @@ pub struct UploadDomainPosition {
697722
698723#[cfg(test)]
699724mod test {
700- use crate::domain_storage::URI_REGEX_STR;
725+ use crate::domain_storage::{DomainStorage, URI_REGEX_STR} ;
701726 use hyper::Uri;
702727 use regex::Regex;
703- use std::fs::File ;
728+ use std::ops::RangeInclusive ;
704729 use std::path::PathBuf;
705730 use std::str::FromStr;
706731
@@ -750,6 +775,14 @@ mod test {
750775 let z: Vec<&str> = z.collect();
751776 println!("{}", z.len());
752777 }
778+
779+ #[test]
780+ fn get_init_version_test() {
781+ assert_eq!(DomainStorage::get_init_version(3), 1..=3);
782+ assert_eq!(DomainStorage::get_init_version(2), 1..=2);
783+ assert_eq!(DomainStorage::get_init_version(4), 2..=4);
784+ assert!(RangeInclusive::new(1, 0).is_empty());
785+ }
753786 // #[test]
754787 // fn test_path() {
755788 // let path = PathBuf::from("/");
0 commit comments