Tar
Tar.create
— Functioncreate(
[ predicate, ] dir, [ tarball ];
[ skeleton, ] [ portable = false ]
) -> tarball
predicate :: String --> Bool
dir :: AbstractString
tarball :: Union{AbstractString, AbstractCmd, IO}
skeleton :: Union{AbstractString, AbstractCmd, IO}
portable :: Bool
قم بإنشاء أرشيف tar ("tarball") للدليل dir
. يتم كتابة الأرشيف الناتج إلى المسار tarball
أو إذا لم يتم تحديد مسار، يتم إنشاء مسار مؤقت وإرجاعه بواسطة استدعاء الدالة. إذا كان tarball
كائن IO، يتم كتابة محتوى tarball إلى ذلك المقبض بدلاً من ذلك (يظل المقبض مفتوحًا).
إذا تم تمرير دالة predicate
، يتم استدعاؤها على كل مسار نظام يتم مواجهته أثناء البحث بشكل متكرر في dir
و path
يتم تضمينه في tarball فقط إذا كانت predicate(path)
صحيحة. إذا كانت predicate(path)
تعيد false لدليل، يتم استبعاد الدليل بالكامل: لن يتم تضمين أي شيء تحت ذلك الدليل في الأرشيف.
إذا تم تمرير الكلمة الرئيسية skeleton
، يتم استخدام الملف أو مقبض IO المعطى كـ "هيكل عظمي" لإنشاء tarball. يمكنك إنشاء ملف هيكل عظمي عن طريق تمرير الكلمة الرئيسية skeleton
إلى الأمر extract
. إذا تم استدعاء create
مع ملف الهيكل العظمي هذا ولم تتغير الملفات المستخرجة، يتم إعادة إنشاء tarball مطابق. لا يمكن استخدام وسائط skeleton
و predicate
معًا.
إذا كانت علامة portable
صحيحة، يتم التحقق من صحة أسماء المسارات على Windows، مما يضمن أنها لا تحتوي على أحرف غير قانونية أو أسماء محجوزة. انظر https://stackoverflow.com/a/31976060/659248 للحصول على التفاصيل.
Tar.extract
— Functionextract(
[ predicate, ] tarball, [ dir ];
[ skeleton = <none>, ]
[ copy_symlinks = <auto>, ]
[ set_permissions = true, ]
) -> dir
predicate :: Header --> Bool
tarball :: Union{AbstractString, AbstractCmd, IO}
dir :: AbstractString
skeleton :: Union{AbstractString, AbstractCmd, IO}
copy_symlinks :: Bool
set_permissions :: Bool
استخرج أرشيف tar ("tarball") الموجود في المسار tarball
إلى الدليل dir
. إذا كان tarball
كائن IO بدلاً من مسار، فسيتم قراءة محتويات الأرشيف من تلك التدفق IO. يتم استخراج الأرشيف إلى dir
الذي يجب أن يكون إما دليلاً فارغًا موجودًا أو مسارًا غير موجود يمكن إنشاؤه كدليل جديد. إذا لم يتم تحديد dir
، يتم استخراج الأرشيف إلى دليل مؤقت يتم إرجاعه بواسطة extract
.
إذا تم تمرير دالة predicate
، يتم استدعاؤها على كل كائن Header
يتم مواجهته أثناء استخراج tarball
ويتم استخراج الإدخال فقط إذا كانت predicate(hdr)
صحيحة. يمكن استخدام ذلك لاستخراج أجزاء معينة من الأرشيف بشكل انتقائي، لتخطي الإدخالات التي تسبب في حدوث خطأ في extract
، أو لتسجيل ما تم استخراجه أثناء عملية الاستخراج.
قبل تمريرها إلى دالة predicate، يتم تعديل كائن Header
بشكل ما من الرأس الخام في الأرشيف: يتم تطبيع حقل path
لإزالة إدخالات .
واستبدال الشرطات المتتالية المتعددة بشرطة واحدة. إذا كان الإدخال من النوع :hardlink
، يتم تطبيع مسار الهدف للرابط بنفس الطريقة بحيث يتطابق مع مسار الإدخال المستهدف؛ يتم تعيين حقل الحجم إلى حجم مسار الهدف (الذي يجب أن يكون ملفًا تم رؤيته بالفعل).
إذا تم تمرير الكلمة الرئيسية skeleton
، يتم كتابة "هيكل عظمي" من الأرشيف المستخرج إلى الملف أو مقبض IO المعطى. يمكن استخدام هذا الملف الهيكلي لإعادة إنشاء أرشيف tar مطابق عن طريق تمرير الكلمة الرئيسية skeleton
إلى دالة create
. لا يمكن استخدام حجتي skeleton
و predicate
معًا.
إذا كانت copy_symlinks
تساوي true
، بدلاً من استخراج الروابط الرمزية كما هي، سيتم استخراجها كنسخ مما ترتبط به إذا كانت داخل الأرشيف وإذا كان من الممكن القيام بذلك. لن يتم نسخ الروابط الرمزية غير الداخلية، مثل الرابط إلى /etc/passwd
. كما لن يتم نسخ الروابط الرمزية التي هي بأي شكل من الأشكال دورية وسيتم تخطيها بدلاً من ذلك. بشكل افتراضي، ستكتشف extract
ما إذا كان يمكن إنشاء الروابط الرمزية في dir
أم لا وستقوم تلقائيًا بنسخ الروابط الرمزية إذا لم يكن من الممكن إنشاؤها.
إذا كانت set_permissions
تساوي false
، فلن يتم تعيين أي أذونات على الملفات المستخرجة.
Tar.list
— Functionlist(tarball; [ strict = true ]) -> Vector{Header}
list(callback, tarball; [ strict = true ])
callback :: Header, [ <data> ] --> Any
tarball :: Union{AbstractString, AbstractCmd, IO}
strict :: Bool
قم بإدراج محتويات أرشيف tar ("tarball") الموجود في المسار tarball
. إذا كان tarball
مقبض IO، اقرأ محتويات tar من هذا التدفق. تُرجع متجهًا من هياكل Header
. انظر Header
لمزيد من التفاصيل.
إذا تم توفير callback
، بدلاً من إرجاع متجه من الرؤوس، يتم استدعاء callback على كل Header
. يمكن أن يكون هذا مفيدًا إذا كان عدد العناصر في tarball كبيرًا أو إذا كنت ترغب في فحص العناصر قبل حدوث خطأ في tarball. إذا كانت دالة callback
يمكن أن تقبل وسيطًا ثانيًا من نوع Vector{UInt8}
أو Vector{Pair{Symbol, String}}
، فسيتم استدعاؤها مع تمثيل بيانات الرأس الخام إما كمتجه بايت واحد أو كمتجه من الأزواج التي تربط أسماء الحقول بالبيانات الخام لذلك الحقل (إذا تم دمج هذه الحقول معًا، فإن النتيجة هي البيانات الخام للرأس).
بشكل افتراضي، ستظهر list
خطأ إذا واجهت أي محتويات tarball التي سترفض دالة extract
استخراجها. مع strict=false
، ستتخطى هذه الفحوصات وتدرج جميع محتويات ملف tar سواء كانت extract
ستقوم باستخراجها أم لا. احذر من أن tarballs الخبيثة يمكن أن تفعل جميع أنواع الحيل والأشياء غير المتوقعة لمحاولة خداعك للقيام بشيء سيء.
إذا كان وسيط tarball
هو ملف هيكل عظمي (انظر extract
و create
) فإن list
ستكتشف ذلك من رأس الملف وستدرج أو تتكرر بشكل مناسب على رؤوس ملف الهيكل العظمي.
Tar.rewrite
— Functionrewrite(
[ predicate, ] old_tarball, [ new_tarball ];
[ portable = false, ]
) -> new_tarball
predicate :: Header --> Bool
old_tarball :: Union{AbstractString, AbstractCmd, IO}
new_tarball :: Union{AbstractString, AbstractCmd, IO}
portable :: Bool
إعادة كتابة old_tarball
إلى التنسيق القياسي الذي ينشئه create
، مع التحقق أيضًا من أنه لا يحتوي على أي شيء قد يتسبب في رفع extract
لخطأ. هذا يعادل وظيفيًا القيام بـ
Tar.create(Tar.extract(predicate, old_tarball), new_tarball)
ومع ذلك، فإنه لا يستخرج أي شيء إلى القرص وبدلاً من ذلك يستخدم دالة seek
للتنقل في بيانات الأرشيف القديم. إذا لم يتم تمرير وسيط new_tarball
، يتم كتابة الأرشيف الجديد إلى ملف مؤقت يتم إرجاع مساره.
إذا تم تمرير دالة predicate
، يتم استدعاؤها على كل كائن Header
يتم مواجهته أثناء استخراج old_tarball
ويتم تخطي الإدخال ما لم يكن predicate(hdr)
صحيحًا. يمكن استخدام ذلك لإعادة كتابة أجزاء فقط من الأرشيف، لتخطي الإدخالات التي قد تتسبب في رفع extract
لخطأ، أو لتسجيل المحتوى الذي يتم مواجهته أثناء عملية إعادة الكتابة.
قبل تمريرها إلى دالة predicate
، يتم تعديل كائن Header
بشكل ما من الرأس الخام في الأرشيف: يتم تطبيع حقل path
لإزالة إدخالات .
واستبدال الشرطات المتتالية المتعددة بشرطة واحدة. إذا كان الإدخال من النوع :hardlink
، يتم تطبيع مسار الهدف بنفس الطريقة بحيث يتطابق مع مسار الإدخال المستهدف؛ يتم تعيين حقل الحجم إلى حجم مسار الهدف (الذي يجب أن يكون ملفًا تم رؤيته مسبقًا).
إذا كانت علامة portable
صحيحة، يتم التحقق من صحة أسماء المسارات على نظام Windows، مما يضمن أنها لا تحتوي على أحرف غير قانونية أو أسماء محجوزة. انظر https://stackoverflow.com/a/31976060/659248 للحصول على التفاصيل.
Tar.tree_hash
— Functiontree_hash([ predicate, ] tarball;
[ algorithm = "git-sha1", ]
[ skip_empty = false ]) -> hash::String
predicate :: Header --> Bool
tarball :: Union{AbstractString, AbstractCmd, IO}
algorithm :: AbstractString
skip_empty :: Bool
احسب قيمة تجزئة الشجرة لشجرة الملفات التي يحتويها ملف tarball. بشكل افتراضي، يستخدم هذا خوارزمية تجزئة الشجرة الخاصة بـ git مع دالة التجزئة الآمنة SHA1 (مثل الإصدارات الحالية من git). وهذا يعني أنه بالنسبة لأي tarball يمكن لـ git تمثيل شجرة ملفاته - أي واحد يحتوي فقط على ملفات، وروابط رمزية، ودلائل غير فارغة - ستكون قيمة التجزئة المحسوبة بواسطة هذه الدالة هي نفسها قيمة التجزئة التي سيحسبها git لتلك الشجرة. لاحظ أن ملفات tarball يمكن أن تمثل أشجار ملفات تحتوي على دلائل فارغة، والتي لا يمكن لـ git تخزينها، ويمكن لهذه الدالة توليد تجزئات لتلك، والتي ستختلف، بشكل افتراضي (انظر skip_empty
أدناه حول كيفية تغيير هذا السلوك)، عن تجزئة tarball التي تتجاهل تلك الدلائل الفارغة. باختصار، تتفق دالة التجزئة مع git على جميع الأشجار التي يمكن لـ git تمثيلها، ولكنها توسع (بشكل متسق) نطاق الأشجار القابلة للتجزئة إلى أشجار أخرى لا يمكن لـ git تمثيلها.
إذا تم تمرير دالة predicate
، يتم استدعاؤها على كل كائن Header
يتم مواجهته أثناء معالجة tarball
ويتم تجزئة الإدخال فقط إذا كانت predicate(hdr)
صحيحة. يمكن استخدام ذلك لتجزئة أجزاء معينة من الأرشيف بشكل انتقائي، لتخطي الإدخالات التي تسبب في حدوث خطأ عند extract
، أو لتسجيل ما يتم استخراجه أثناء عملية التجزئة.
قبل تمريرها إلى دالة predicate، يتم تعديل كائن Header
بشكل ما من الرأس الخام في tarball: يتم تطبيع حقل path
لإزالة إدخالات .
واستبدال الشرطات المتتالية المتعددة بشرطة واحدة. إذا كان الإدخال من النوع :hardlink
، يتم تطبيع مسار الهدف بنفس الطريقة بحيث يتطابق مع مسار الإدخال المستهدف؛ يتم تعيين حقل الحجم إلى حجم مسار الهدف (الذي يجب أن يكون ملفًا تم رؤيته مسبقًا).
القيم المدعومة حاليًا لـ algorithm
هي git-sha1
(الافتراضي) و git-sha256
، والتي تستخدم نفس الخوارزمية الأساسية مثل git-sha1
ولكن تستبدل دالة التجزئة SHA1 بـ SHA2-256، دالة التجزئة التي سيتحول git لاستخدامها في المستقبل (بسبب الهجمات المعروفة على SHA1). قد يتم إضافة دعم لخوارزميات تجزئة أشجار الملفات الأخرى في المستقبل.
تتحكم خيار skip_empty
فيما إذا كانت الدلائل في tarball التي تحتوي بشكل متكرر على ملفات أو روابط رمزية فارغة مشمولة في التجزئة أو يتم تجاهلها. بشكل عام، إذا كنت تقوم بتجزئة محتوى tarball أو شجرة ملفات، فإنك تهتم بجميع الدلائل، وليس فقط غير الفارغة، لذا فإن تضمين هذه في التجزئة المحسوبة هو الافتراضي. فلماذا توفر هذه الدالة حتى خيار تخطي الدلائل الفارغة؟ لأن git يرفض تخزين الدلائل الفارغة وسيتجاهلها إذا حاولت إضافتها إلى مستودع. لذا إذا قمت بحساب تجزئة شجرة مرجعية عن طريق إضافة ملفات إلى مستودع git ثم طلبت من git الحصول على تجزئة الشجرة، ستكون قيمة التجزئة التي تحصل عليها مطابقة لقيمة التجزئة المحسوبة بواسطة tree_hash
مع skip_empty=true
. بعبارة أخرى، يتيح هذا الخيار لـ tree_hash
محاكاة كيفية تجزئة git لشجرة تحتوي على دلائل فارغة. إذا كنت تقوم بتجزئة الأشجار التي قد تحتوي على دلائل فارغة (أي لا تأتي من مستودع git)، ومع ذلك، يُوصى بأن تقوم بتجزئتها باستخدام أداة (مثل هذه) لا تتجاهل الدلائل الفارغة.
Tar.Header
— Typeنوع Header
هو هيكل يمثل البيانات الوصفية الأساسية لسجل واحد في ملف tar مع هذا التعريف:
struct Header
path :: String # المسار النسبي للجذر
type :: Symbol # مؤشر النوع (انظر أدناه)
mode :: UInt16 # الوضع/الأذونات (من الأفضل مشاهدته في النظام الثماني)
size :: Int64 # حجم بيانات السجل بالبايت
link :: String # المسار المستهدف للارتباط الرمزي
end
تمثل الأنواع بالرموز التالية: file
، hardlink
، symlink
، chardev
، blockdev
، directory
، fifo
، أو للأنواع غير المعروفة، حرف typeflag كرمز. لاحظ أن extract
ترفض استخراج سجلات الأنواع الأخرى غير file
و symlink
و directory
؛ بينما list
ستقوم فقط بإدراج أنواع أخرى من السجلات إذا تم استدعاؤها مع strict=false
.
يتضمن تنسيق tar بيانات وصفية متنوعة أخرى حول السجلات، بما في ذلك معرفات المستخدم والمجموعة، وأسماء المستخدمين والمجموعات، والطوابع الزمنية. حزمة Tar
، حسب التصميم، تتجاهل تمامًا هذه البيانات. عند إنشاء ملفات tar، يتم دائمًا تعيين هذه الحقول إلى صفر/فارغ. عند قراءة ملفات tar، يتم تجاهل هذه الحقول باستثناء التحقق من مجموعات التحقق للرؤوس لكل سجل رأس لجميع الحقول.