Close Menu
    DevStackTipsDevStackTips
    • Home
    • News & Updates
      1. Tech & Work
      2. View All

      A Breeze Of Inspiration In September (2025 Wallpapers Edition)

      August 31, 2025

      10 Top Generative AI Development Companies for Enterprise Node.js Projects

      August 30, 2025

      Prompting Is A Design Act: How To Brief, Guide And Iterate With AI

      August 29, 2025

      Best React.js Development Services in 2025: Features, Benefits & What to Look For

      August 29, 2025

      Report: Samsung’s tri-fold phone, XR headset, and AI smart glasses to be revealed at Sep 29 Unpacked event

      September 1, 2025

      Are smart glasses with built-in hearing aids viable? My verdict after months of testing

      September 1, 2025

      These 7 smart plug hacks that saved me time, money, and energy (and how I set them up)

      September 1, 2025

      Amazon will sell you the iPhone 16 Pro for $250 off right now – how the deal works

      September 1, 2025
    • Development
      1. Algorithms & Data Structures
      2. Artificial Intelligence
      3. Back-End Development
      4. Databases
      5. Front-End Development
      6. Libraries & Frameworks
      7. Machine Learning
      8. Security
      9. Software Engineering
      10. Tools & IDEs
      11. Web Design
      12. Web Development
      13. Web Security
      14. Programming Languages
        • PHP
        • JavaScript
      Featured

      Fake News Detection using Python Machine Learning (ML)

      September 1, 2025
      Recent

      Fake News Detection using Python Machine Learning (ML)

      September 1, 2025

      Common FP – A New JS Utility Lib

      August 31, 2025

      Call for Speakers – JS Conf Armenia 2025

      August 30, 2025
    • Operating Systems
      1. Windows
      2. Linux
      3. macOS
      Featured

      Chrome on Windows 11 FINALLY Gets Touch Drag and Drop, Matching Native Apps

      August 31, 2025
      Recent

      Chrome on Windows 11 FINALLY Gets Touch Drag and Drop, Matching Native Apps

      August 31, 2025

      Fox Sports not Working: 7 Quick Fixes to Stream Again

      August 31, 2025

      Capital One Zelle not Working: 7 Fast Fixes

      August 31, 2025
    • Learning Resources
      • Books
      • Cheatsheets
      • Tutorials & Guides
    Home»News & Updates»CodeSOD: Back Up for a Moment

    CodeSOD: Back Up for a Moment

    July 14, 2025

    James‘s team has a pretty complicated deployment process implemented as a series of bash scripts. The deployment is complicated, the scripts doing the deployment are complicated, and failures mid-deployment are common. That means they need to gracefully roll back, and they way they do that is by making backup copies of the modified files.

    This is how they do that.

    DATE=`<span class="hljs-built_in">date</span> <span class="hljs-string">'+%Y%m%d'</span>`
    BACKUPDIR=`<span class="hljs-built_in">dirname</span> <span class="hljs-variable">${DESTINATION}</span>`/backup
    <span class="hljs-keyword">if</span> [ ! -d <span class="hljs-variable">$BACKUPDIR</span> ]
    <span class="hljs-keyword">then</span>
            <span class="hljs-built_in">echo</span> <span class="hljs-string">"Creating backup directory ..."</span>
            <span class="hljs-built_in">mkdir</span> -p <span class="hljs-variable">$BACKUPDIR</span>
    <span class="hljs-keyword">fi</span>
    FILENAME=`<span class="hljs-built_in">basename</span> <span class="hljs-variable">${DESTINATION}</span>`
    BACKUPFILETYPE=<span class="hljs-variable">${BACKUPDIR}</span>/<span class="hljs-variable">${FILENAME}</span>.<span class="hljs-variable">${DATE}</span>
    BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-1
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-2 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-3 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-4 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-5 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-6 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-7 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-8 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span> BACKUPFILE=<span class="hljs-variable">${BACKUPFILETYPE}</span>-9 ; <span class="hljs-keyword">fi</span>
    <span class="hljs-keyword">if</span> [ -f <span class="hljs-variable">${BACKUPFILE}</span> ] || [ -f <span class="hljs-variable">${BACKUPFILE}</span>.gz ] ; <span class="hljs-keyword">then</span>
    <span class="hljs-built_in">cat</span> <<<span class="hljs-string">EOF
    You have already had 9 rates releases in one day.
    
    ${BACKUPFILE} already exists, do it manually !!!
    EOF</span>
    <span class="hljs-built_in">exit</span> 2
    <span class="hljs-keyword">fi</span>
    

    Look, I know that loops in bash can be annoying, but they’re not that annoying.

    This code creates a backup directory (if it doesn’t already exist), and then creates a file name for the file we’re about to backup, in the form OriginalName.Ymd-n.gz. It tests to see if this file exists, and if it does, it increments n by one. It does this until either it finds a file name that doesn’t exist, or it hits 9, at which point it gives you a delightfully passive aggressive message:

    You have already had 9 rates releases in one day.
    ${BACKUPFILE} already exists, do it manually !!!

    Yeah, do it manually. Now, admittedly, I don’t think a lot of folks want to do more than 9 releases in a given day, but there’s no reason why they couldn’t just keep trying until they find a good filename. Or even better, require each release to have an identifier (like the commit or build number or whatever) and then use that for the filenames.

    Of course, just fixing this copy doesn’t address the real WTF, because we laid out the real WTF in the first paragraph: deployment is a series of complicated bash scripts doing complicated steps that can fail all the time. I’ve worked in places like that, and it’s always a nightmare. There are better tools! Our very own Alex has his product, of course, but there are a million ways to get your builds repeatable and reliable that don’t involve BuildMaster but also don’t involve fragile scripts. Please, please use one of those.

    [Advertisement] Plan Your .NET 9 Migration with Confidence
    Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. Download Free Guide Now!

    Source: Read More 

    Facebook Twitter Reddit Email Copy Link
    Previous ArticleCritical Vulnerability in Anthropic’s MCP Exposes Developer Machines to Remote Exploits
    Next Article Rilasciata GParted Live Live 1.7.0-8: Essenziale per la Gestione delle Partizioni

    Related Posts

    News & Updates

    Report: Samsung’s tri-fold phone, XR headset, and AI smart glasses to be revealed at Sep 29 Unpacked event

    September 1, 2025
    News & Updates

    Are smart glasses with built-in hearing aids viable? My verdict after months of testing

    September 1, 2025
    Leave A Reply Cancel Reply

    For security, use of Google's reCAPTCHA service is required which is subject to the Google Privacy Policy and Terms of Use.

    Continue Reading

    White House seeks 10% increase in cybersecurity spend

    Development

    CVE-2025-24252 – Apple macOS Use-After-Free Vulnerability

    Common Vulnerabilities and Exposures (CVEs)

    CVE-2025-4044 – Lexmark XML XXE Disclosure

    Common Vulnerabilities and Exposures (CVEs)

    CVE-2025-5621 – D-Link DIR-816 OS Command Injection Vulnerability

    Common Vulnerabilities and Exposures (CVEs)

    Highlights

    NVIDIA confirms final driver support for GTX 900 and 1000 series cards

    July 1, 2025

    NVIDIA is phasing out support for some of its most iconic GPUs. The company has…

    Key Considerations Before Outsourcing Your Mobile App Development

    April 23, 2025

    Urgent WordPress Alert: Motors Theme Flaw (CVE-2025-4322) Actively Exploited for Site Takeover

    June 20, 2025

    B2B Travel Booking Software

    July 22, 2025
    © DevStackTips 2025. All rights reserved.
    • Contact
    • Privacy Policy

    Type above and press Enter to search. Press Esc to cancel.